例外

公式サイト:

class Exception | Ruby リファレンスマニュアル [公式]

使い方

rescue で型を指定しなかった場合、 StandardError (とそのサブクラス) のみがキャッチされる。

begin
    raise "Error"                 # will be caught
    raise Exception.new("Error")  # will not be caught
rescue => e
    puts e.message
endCode language: Ruby (ruby)
  • StandardErrorException のサブクラス
  • RuntimeErrorStandardError のサブクラス
  • RuntimeError < StandardError < Exception
  • Exception はシステム関係の例外も含む
  • アプリケーションレベルの例外は StandardError (とそのサブクラス) を使うべき

参考:

例外処理まとめ – Qiita

例外についてまとめてみた – Qiita

例外処理 – Qiita

例外処理 (begin – rescue と raise) をもう一度きちんと確認してみた – Qiita

Ruby の例外処理 | UX MILK

予期しないエラーが発生した場合、例外処理をする | あずきぱん

例外処理の書き方 | 世界一適当な技術ブログ

Exception

全ての例外の祖先のクラス。

begin
    raise Exception.new("Error")
rescue Exception => e
    puts e.message
endCode 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 節で、例外を外部のコードに伝搬させるために使用する。

raiseCode 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 によりセットされる。

$! は最後に発生した例外が格納される。

$!

$@ は最後に例外が発生したソースコード上の位置が格納される。

$@

参考:

$! | Ruby リファレンスマニュアル [公式]

$@ | Ruby リファレンスマニュアル [公式]

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

特殊変数

  • $!最後に発生した例外

参考:

$! | Ruby リファレンスマニュアル [公式]

e2mmap

例外にエラーメッセージフォーマットをマッピングするためのライブラリ

参考:

ruby/e2mmap: Module for Defining Custom Exceptions with Specific Messages – GitHub

ドキュメント:

Documentation – e2mmap | RubyDoc.info

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA