技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

Ruby 例外処理の書き方

Ruby 例外処理の書き方

Rubyの例外処理の書き方は以下のようにbegin ~ rescue ~ end文を活用します。

begin
 例外を発生させる可能性のある処理
rescue
 例外が起こった場合の処理
end

例外クラスを指定する場合はこんな感じ

begin
  1/0
rescue  ZeroDivisionError
  puts"0で除算しました"
end

例外情報をオブジェクトとして扱う方法

begin
 例外を発生させる可能性のある処理
rescue => 例外オブジェクトが代入される変数
 例外が起こった場合の処理
end

常に実行したい処理がある場合はensureを使う

begin
 例外を発生させる可能性のある処理
rescue => 変数
 例外が起こった場合の処理
ensure
 例外の有無にかかわらずに実行される処理
end

例外時に何かやり直したいときはretryを利用する

begin
  #例外が発生するかもしれない処理
rescue
  retry#処理をやりなおす
end

明示的に例外エラーを発生させる方法

例外エラーを発生させたい箇所にraiseを記載する。

raise

第1引数に例外を、第2引数にエラーメッセージを渡すことも可能です。

raiseArgumentError,"あーぎゅめんとえらーです"

もう一歩踏み込んで、例外オブジェクトから情報を取得する。

begin
  1/0
rescue=>e
  puts"エラークラス:#{e.class}"
  puts"エラーメッセージ:#{e.message}"
  puts"バックトレース--------"
  puts e.backtrace
  puts"--------"
end

e.class -> エラークラス取得 e.message -> エラーメッセージ取得 e.backtrace -> エラーまでのトレース情報を取得

エラークラス:ZeroDivisionError
エラーメッセージ:divided by 0
バックトレース(irb):2:in`/'
(irb):2:in`irb_binding'
省略/(Rubyがインストールされているパス)/irb:11:in`<main>'
--------

例外クラスの継承関係

f:id:lhiroki1205:20190620133442p:plain

参考画像:伊藤 淳一. プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発デバッグ技法まで

standarderrorは通常のプログラムで発生する可能性の高い例外を表すクラス rescueで特に指定しなかった場合はstandarderrorとstandarderrorのサブクラスしかrescue出来ない。

参考書籍

伊藤 淳一. プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発デバッグ技法まで