ruby silverの勉強をしていく中で間違えたところがあったのでその解説記事を挙げていきます。
例外処理は、rubysilverでは、この問題は頻繁に出てくるので重要な問題です。
##例外処理とは?
例外処理とは、
**もともと想定されている値などが入力されたときに、どんな処理をするのか?**を書くことをいうんです。
例えば、よく知られているのはNomethoderror, Nameerror, Argumenterror, Syntaxerror などがありますね。
これも立派な例外処理なんですね。
##例外処理の書き方
結論からいうと、以下のような書き方になります。
begin
実行するコード
rescue
例外が発生した時に、実行するコード
else
例外が発生しなかったときに、実行するコード
end
意外とシンプルなんですね。
では、実際に具体的なコードを書いてみていきましょう!
begin
puts hoge
rescue => e
p e
p e.class # 例外の種類
p e.message # 例外のメッセージ
else
p '例外は発生しませんでした'
ensure
p 'プログラム終了'
end
#<NameError: undefined local variable or method `hoge' for main:Object>
NameError
"undefined local variable or method `hoge' for main:Object"
"プログラム終了"
=> "undefined local variable or method `hoge' for main:Object"
例外処理では、変数名をつけて、変数名でエラー情報を取得することがよくあります。その変数名にはeがよく使われます。
今回のコードを解説すると、
2行目のhogeというのは、変数です。hogeは定義されていないので、Nameerrorが出力されることが予想されます。
これを3行目で、変数eに格納します。
rescue内では、エラーが発生した時に実行するコードが書かれています。その中ではクラス名を返すメソッドや、メッセージを返す返すメソッドが記述されています。
7行目のelseでは、例外が発生しなかった場合になされる処理です。つまり、今回のhogeが定義されていたら、rescue内は実行されないので、
else内の処理がされます。
9行目のensureでは、例外の有無に関わらず、最後に実行したい処理です。
今回のコードでいえば、例外があるにしろ、無しにしろ、「'プログラム終了'」を出力します。
他にも以下のようなメソッドがありますので、公式ドキュメントやググって調べてみてください。
| メソッド | 処理 |
|:|:-:|
| Object#class |エラーのクラスを返します。 |
| Kernel#raise |エラーを発生させます。 |
| Exception#backtrace | エラーのバックトレースを返します。 |
| Exception#message | エラーのメッセージを返します |
##今回の問題
上から順に説明していきましょう。
exceptionsという変数に、以下3行を代入しています。
beginからrescueまでは、実行したい処理でしたね。
今回の実行したい処理はraiseです。raiseは意図的に実行したい処理のことです。
本来であれば、
raise NomethodError
などと書かれていますが、今回はraiseしか書かれていません。
このように引数が何も書かれていないときは、RuntimeErrorが発生します。
そのため、今回の問題ではRuntimeErrorで、それの出力する日本語が、
"特定の例外が発生しました"
が今回の答えなんです。
以上です。
何か間違いがございましたら、ご教示いただけますと幸いです。
【追記】
上の書き方以外の例外クラスを捕捉する際の書き方は以下の通りです。
#書き方➀
begin
rescue NomethodError, NameError
end
#書き方➁
begin
rescue *[NomethodError, NameError]
end