throws はより軽量だと思いますし、また、例外を throw するのは Either / Result に対する do 記法だという立場からすると、 treat が例外を throw するのと結果を return するのは同じことだとも言えます。can_treat を使う方式だと、チェック忘れを静的に検査できず treat が実行時エラーを起こす可能性を排除できません。Iterator が next で throw して分岐するか、 hasNext でチェックするまたは next が Optional を返すかという話が載っていて後者が望ましいとあるんですけど、 Optional を Result の一種だと考えると、 throw するか Optional を return するのは同じことだとも言えます。 (edited)