例外
公式サイト:
class Exception | Ruby リファレンスマニュアル [公式]
使い方
rescue
で型を指定しなかった場合、 StandardError
(とそのサブクラス) のみがキャッチされる。
begin
raise "Error" # will be caught
raise Exception.new("Error") # will not be caught
rescue => e
puts e.message
end
Code language: Ruby (ruby)
StandardError
はException
のサブクラスRuntimeError
はStandardError
のサブクラスRuntimeError
<StandardError
<Exception
Exception
はシステム関係の例外も含む- アプリケーションレベルの例外は
StandardError
(とそのサブクラス) を使うべき
参考:
例外処理 (begin – rescue と raise) をもう一度きちんと確認してみた – Qiita
予期しないエラーが発生した場合、例外処理をする | あずきぱん
Exception
全ての例外の祖先のクラス。
begin
raise Exception.new("Error")
rescue Exception => e
puts e.message
end
Code language: Ruby (ruby)
参考:
class Exception | Ruby リファレンスマニュアル [公式]
Exception#message | Ruby リファレンスマニュアル [公式]
Exception#backtrace | Ruby リファレンスマニュアル [公式]
Exception.new
例外オブジェクトを生成して返す。
new(error_message = nil) -> Exception exception(error_message = nil) -> Exception
error_message
- エラーメッセージを指定する。
Exception#message
が返す値となり、デフォルトの例外ハンドラで表示される。
e = Exception.new("This is an error.")
p e # => #<Exception: This is an error.>
puts e.message # => "This is an error."
Code language: Ruby (ruby)
参考:
Exception.exception | Ruby リファレンスマニュアル [公式]
StandardError
通常のプログラム (アプリケーション) で発生する例外を束ねるクラス。
rescue
節でクラスを省略した場合、StandardError
とそのサブクラスの例外が捕捉される。
参考:
独自例外を定義するときは StandardError を継承する | Hack Your Design!
自前の例外クラスで StandardError を継承する | deadwood
エラーコード付きの独自例外クラスを作成 + カスタム logger で出力 | のんびり SE の議事録
自前の例外クラスを作るとき Exception ではなく StandardError を継承する理由 | yarb の日記
class StandardError | Ruby リファレンスマニュアル [公式]
RuntimeError
特定の例外クラスに該当しないエラーが起こった場合に発生する例外。
Kernel.#raise
で例外クラスを指定しなかった場合には、RuntimeError
が発生する。
raise "Error" # => throw: `RuntimeRrror`
Code language: Ruby (ruby)
参考:
class RuntimeError | Ruby リファレンスマニュアル [公式]
ArgumentError
数や型の不一致、範囲外の値が指定されたなど、引数に起因するエラー。
参考:
class ArgumentError | Ruby リファレンスマニュアル [公式]
raise
例外 RuntimeError
を発生させる。
raise "Error"
Code language: Ruby (ruby)
例外 SyntaxError
を発生させる。
raise SyntaxError, "Invalid syntax"
raise SyntaxError.new("Invalid syntax")
Code language: Ruby (ruby)
最後の例外を再発生させる。rescue
節で、例外を外部のコードに伝搬させるために使用する。
raise
Code language: Ruby (ruby)
参考:
Kernel.#fail | Ruby リファレンスマニュアル [公式]
raise – 制御構造 | Ruby リファレンスマニュアル [公式]
How do I add information to an exception message in Ruby? – Stack Overflow
begin … rescue … ensure … end
begin expressions... [rescue [error_type, ...] [=> evar] [then] expressions...]... [else expressions...] [ensure expressions...] end
begin
から rescue
までが例外の捕捉対象 (本体) となる。
例外が指定した例外クラスのインスタンス (サブクラスを含む) である場合に、該当する rescue
節に捕捉され、その rescue
節が実行される。
例外が発生しなかった場合に else
節が実行される。
例外の発生・非発生に関わらず、ensure
節は最後に必ず実行される。
begin
式全体の評価値は、本体 / rescue
節 / else
節のうち最後に評価された文の値となる。各節において文が存在しなかったときの評価値は nil
となる。ensure
節の値は無視される。
クラス / モジュール / メソッドの定義では、begin
キーワードを使うことなく定義全体 (本体) を処理対象として rescue
節、else
節、ensure
節によって例外を処理することができる。
参考:
begin – 制御構造 | Ruby リファレンスマニュアル [公式]
rescue 修飾子
expr1 rescue expr2
参考:
begin – 制御構造 | Ruby リファレンスマニュアル [公式]
特殊変数
$!
、$@
は例外発生時、Kernel.#raise
によりセットされる。
$!
は最後に発生した例外が格納される。
$!
$@
は最後に例外が発生したソースコード上の位置が格納される。
$@
参考:
message
参考:
Exception#message | Ruby リファレンスマニュアル [公式]
Accessing error messages within a rescue block – Stack Overflow
backtrace
参考:
エラーを rescue して、rescue しない場合と全く同じエラーメッセージを出力する – Qiita
Exception#backtrace | Ruby リファレンスマニュアル [公式]
How do I get ruby to print a full backtrace instead of a truncated one? – Stack Overflow
How can I nicely print a formatted exception that I catch in a rescue block? – Stack Overflow
cause
参考:
RuntimeError のバックトレースを最初の raise までさかのぼって出力する – Qiita
Exception#cause | Ruby リファレンスマニュアル [公式]
full_message
参考:
Exception#full_message | Ruby リファレンスマニュアル [公式]
How to display error type? – Stack Overflow
at_exit
参考:
Kernel.#at_exit | Ruby リファレンスマニュアル [公式]
Global exception handler – Stack Overflow
特殊変数
$!
:最後に発生した例外
参考:
e2mmap
例外にエラーメッセージフォーマットをマッピングするためのライブラリ
参考:
ruby/e2mmap: Module for Defining Custom Exceptions with Specific Messages – GitHub
ドキュメント: