0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby 基本文法【例外処理編】

Last updated at Posted at 2023-06-27

はじめに

Rubyの基本文法 「例外処理」についてのご紹介です。
基本文法シリーズは今回でラストです。

目次

  1. 例外処理
  2. 参考文献

例外処理

プログラム動作における例外発生時に行う処理のことです。
Rubyでの例外処理の方法としては、begin, rescue, raise があります。

begin

  • フォーマット
    begin
        実行するコード
    rescue
        例外発生時に実行されるコード
    end
    
    数値を0で割る計算はできないので例外となり、rescue内のコードが実行されます。
    def output_exception
      begin
        p 1/0
      rescue
        p "例外発生"
      end
    end
    
    output_exception
    
    実行結果
    "例外発生"
    
    例外発生時、例外情報を取得する。
    begin
      p 1/0
    rescue => e
      p e # 例外情報
      p e.class # 例外の種類
      p e.message # 例外のメッセージ
      p e.backtrace # 例外が発生した位置情報
    end
    
    実行結果
    #<ZeroDivisionError: divided by 0>
    ZeroDivisionError
    "divided by 0"
    ["exception.rb:5:in `/'", "exception.rb:5:in `output_exception'","exception.rb:14:in `<main>'"]
    
    else構文(例外が発生しなかったときだけ実行したいコード)を加えることもできます。
    フォーマット
    begin
        実行するコード
    rescue
        例外発生時に実行されるコード
    else
        例外が発生しなかった時に実行されるコード
    end
    
    begin
      p "テスト"
    rescue
      p "例外発生"
    else
      p "例外発生なし"
    end
    
    実行結果
    "テスト"
    "例外発生なし"
    

rescue

ensure構文(例外の有無に関わらず最後に実行したいコード)を加えることもできます。

  • フォーマット
    begin
        実行するコード
    rescue
        例外発生時に実行されるコード
    else
        例外が発生しなかった時に実行されるコード
    ensure
        例外の有無にかかわらず最後に実行されるコード
    end
    
    begin
      p "テスト"
    rescue
      p "例外発生"
    else
      p "例外発生なし"
    ensure
      p "プログラム終了"
    end
    
    実行結果
    "テスト"
    "例外発生なし"
    "プログラム終了"
    

raise

raiseは、例外を意図的に起こしたい場合に使用します。

  • フォーマット
    raise
    
    begin
      raise
    rescue
      p "例外発生"
    end
    
    実行結果
    "例外発生"
    

    raiseの後ろに例外の種類を指定することもできます。

    フォーマット
    raise 例外の種類
    
    begin
      raise NameError
    rescue => e
      p "例外発生"
      p e
    end
    
    実行結果
    "例外発生"
    #<NameError: NameError>
    

    例外のメッセージを指定することもできます。

    フォーマット
    raise 例外の種類, 例外のメッセージ
    
    begin
      raise NameError, "例外のテスト"
    rescue => e
      p "例外発生"
      p e
    end
    
    実行結果
    "例外発生"
    #<NameError: 例外のテスト>
    

    ※ 上記ですが「例外の種類」を消して「例外のメッセージ」のみの指定も可能です。

    例外のやり直しも可能です。

    フォーマット
    retry
    
    count = 0
    
    begin
      raise
    rescue
      count += 1
      p "処理失敗#{count}回目"
      if count < 3
        retry
      end
    
      p "終了"
    end
    
    実行結果
    "処理失敗1回目"
    "処理失敗2回目"
    "処理失敗3回目"
    "終了"
    

    メソッド全体へ例外処理を設ける場合、beginendは省略できます。

    def test
      p 1/0
    rescue
      p "例外発生"
    end
    
    test
    
    実行結果
    "例外発生"
    

参考文献

【Ruby入門】初心者でもわかる基礎文法まとめ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?