Scalaプログラミング3 例外処理
Beginning Scala programming3
初心者ぺちぱーがGitHubでScalaレッスンを始めたぞ。3回目は例外処理のtry
、catch
を覚えよう。
- Scalaスケーラブルプログラミング第2版
- 作者
- Martin Odersky
- Lex Spoon
- Bill Venners
- 出版社
- インプレスジャパン
- 発売日
- 2011-09-27
- メディア
- 単行本(ソフトカバー)
- 価格
- ¥ 4,968
Lessen3: try expressions
引き続き、練習問題はここのページだ。今回の問題は1回目と同じHello Worldを使ってみようと思う。
Hello World![改行]を5回表示させてください。
可能ならコマンドラインから入力を受け取って、n回表示するように改造してください。 何回目のHello World!かも表示してみてください。
Scalaの例外処理はJavaや他の言語と同じく、try
-catch
を使って発生した例外をキャッチする。ただし、catch
の書き方がちょっと違う。
catch
の中身は前回やったパターンマッチと同じ書き方になっている。これで例外の型に応じて何かをする、という処理が書けるわけだ。Javaのcatch
と比べるとかなりスッキリした書き方よね。
さて、練習問題の、コマンドラインからの引数を受け取るコードを書いてみよう。
case1は引数が指定されていない場合の処理だ。3行目のargs(0)
で発生する例外よね。
case2は期待している引数がIntなので、文字列や5.2
みたいな値が指定された場合の処理だ。これは5行目のformat(n)
のところ。
case3は全部の例外をキャッチしている。このコードでは(多分)発生しないんじゃないかと思う。なんとなく書いてみた。ここはプレースホルダーを使って、こう書いても大丈夫。
finally expression
try
式が評価された時に、例外が発生する、しないに関わらず、finally
式を付けておくと、必ずこの中身が実行される。これはJavaと同じよね。それから、Scalaのtry
-catch
は値を返すので、こんな書き方が出来る。
これを実行すると、先に"try"、"finally"と表示された後で、-1
が表示される。"できた?"は、直前の行で例外が発生しているので、表示されない。
The finally expression e is expected to conform to type Unit
でもfinally
自体は値を返さないので、次のコードを実行しても0
は表示されず、9
だけが表示される。
値が返ってくるのなら、変数に入れることもできる。
ぬぬぬ!?なんかエラーメッセージが表示されたぞ。
finally
は値を返さないので、この場合の0
は意味ないよね、というメッセージだ。println
したときは出てこなかったのに、なんでだろう。
What if a finally expression throws an exception?
finally
の中で例外が発生すると、この例外をキャッチしていない場合には、発生した例外がスローされる。
try
でもfinally
でも例外が発生すると、finally
で発生した例外がスローされるようだ。try
ではjava.lang.IndexOutOfBoundsException: 3
が発生しているはずだが、表示されているのはjava.lang.IndexOutOfBoundsException: 2
になった。
Conclusion
3回目のレッスンもGitHubに上げてある。今回はまとめっぽいまとめだな。色々出てきたけど、Scalaで例外処理を覚えたよ!やったね!
try
-catch
で例外をキャッチするcatch
はパターンマッチで書くfinally
は必ず評価されるtry
とcatch
は値を返すけど、finally
は値を返さないfinally
で例外が発生すると、その例外がスローされるから気をつけてね