mgmmyBlog

Webエンジニア👩‍💻 Railsの話がメインです。

【Ruby】『raise』意図的に例外を発生させる

f:id:mgmmy:20191130152416p:plain

意図的に例外を発生させる

概要

  • raiseメソッドを使用する
  • メソッドを実行するとRuntimeErrorが発生する
  • メソッドの引数に文字列を渡すと、その文字列がエラーメッセージになる。
    • 文字列は省略もできるが、原因が特定しづらくなるためあまり良くない。
  • 第1引数例外クラス第2引数文字列を渡すとRuntimeError以外の例外を発生させることができる。

使い方

引数に文字列のみを渡すと、RuntimeErrorが発生する。

def capital_of(country)
  case country
  when :japan
    'tokyo'
  when :china
    'beijing'
  when :france
    'paris'
  else
    raise "無効な国名です。#{country}"
  end
end

capital_of(:japan) # => "tokyo"
capital_of(:india) # => RuntimeError: 無効な国名です。india

例外クラスを指定することもできる

def capital_of(country)
  case country
  when :japan
    'tokyo'
  when :china
    'beijing'
  when :france
    'paris'
  else
    raise ArgumentError, "無効な国名です。#{country}"
  end
end

capital_of(:china) # => "beijing"
capital_of(:italy) # => ArgumentError: 無効な国名です。italy

文字列を省略することも可能だが、原因がわかりにくいため避ける。

def capital_of(country)
  case country
  when :japan
    'tokyo'
  when :china
    'beijing'
  when :france
    'paris'
  else
    raise
  end
end

capital_of(:japan) # => "tokyo"
capital_of(:germany) # => RuntimeError ※原因がわかりにくい!

コメント

実際に使用した場面は、特定の権限のユーザーがログインしたときの条件分岐で
何も当てはまらない場合に例外を起こすように実装を行った。

エラー原因がわかりにくいエラーメッセージが出ていたので、
エンジニアサイドで原因がすぐに理解できるようエラーメッセージを表示させた。

意図的に例外を発生させるってなんのためにやるのかイマイチわからなかったけど、
エラーが起きたときに、原因がわかるようにすることが目的だったのか〜😉