Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyの例外

例外 例外的なに関する情報を保持する特別なデータ構造です。 アプリケーションで発生している状態。例外は、特定の状況に対処する方法がわからないためにプログラムを実行し続けることができない場合に送信されるシグナルです。 Rubyでは、このようなシグナルの送信を発生と呼びます。 例外。

raise 'this is an exception'
 
puts "This message won't be printed."

動作中の例外を確認する最も簡単な方法は、自分で例外を発生させることです。 raiseを使用する メッセージ付きのメソッドの場合、RubyはRuntimeErrorを作成します 渡されたテキストを説明として使用します。また、コード内で例外が発生した場所を示すスタックトレースも追加されます。

$ ruby raise.rb
raise.rb:1:in `<main>': this is an exception (RuntimeError)

上記のサンプルスクリプトを実行すると、約束どおり、例外が発生した後はメッセージが出力されないことがわかります。これは、未処理の例外がクラッシュを引き起こしてプログラムの実行を停止するためです。これは、タスクの1つを完了できなかった後でも、アプリケーションが実行され続けないようにするためです。

さまざまな種類の例外

内部的には、Rubyは問題が発生したときに例外を発生させます。たとえば、数値をゼロで割り込もうとすると、例外が発生します。

irb(main):001:0> 42/0
ZeroDivisionError: divided by 0
        from (irb):1:in `/'
        from (irb):1
        from /Users/jeff/.asdf/installs/ruby/2.3.0/bin/irb:11:in `<main>'

この場合、例外のタイプはZeroDivisionErrorです。 、RuntimeErrorの代わりに 前に見ました。 Rubyの例外階層を形成するための例外タイプは数十あり、それらはすべてさまざまな状況で発生します。

RuntimeError はより一般的な例外クラスですが、より具体的な例があります。 NoMethodError 存在しないメソッドを呼び出そうとすると発生し、ArgumentError たとえば、間違った引数が既存のメソッドに渡されることに注意してください。

例外の救済

ほとんどのアプリケーションには、例外から回復する機能が必要です。 Webアプリケーションでは、ユーザーがフォームに誤ったデータを送信するとエラーが発生する可能性があります。これにより、Webサーバー全体がクラッシュするのではなく、エラーメッセージがユーザーに表示されます。

このような場合、例外が発生する可能性がありますが、呼び出しスタックの最上位に到達する前にWebサーバーによってレスキューされ、例外がアプリケーションをクラッシュするのを防ぎます。

begin
  raise 'this is an exception'
rescue RuntimeError => exception
  puts "Exception rescued: #{exception.inspect}"
  # => "Exception rescued: #<RuntimeError: this is an exception>"
end
 
puts "This message *will* be printed."

前の例をbegin/rescueブロックでラップすることで、例外が発生したり、アプリがクラッシュしたりすることはありません。代わりに、この場合、例外が阻止されたことを説明するメッセージを出力するレスキューブロックが実行されます。また、これによりアプリがクラッシュするのを防ぐため、最後のメッセージは 印刷されます。

この例は、特にRuntimeErrorから救済します sなので、他のエラーは検出されません。さまざまなエラーが発生したときにさまざまなことを実行できるため、どのエラーが救済されるかを具体的に指定すると便利です。また、あまりにも多くの例外を救出しないようにすることが重要です。

例外処理に関するより詳細な入門書、および例外を適切にレスキューする方法に関するヒントについては、RubyMagicの例外入門書を確認してください。

Rubyで例外を発生させたりキャッチしたりすることについて質問がありますか? @AppSignalまでお気軽にお知らせください。もちろん、この記事がどのように気に入ったか、または別のテーマがある場合はもっと知りたいと思います。


  1. Rubyで例外にコンテキストデータを追加する方法

    標準のバックトレース/エラーメッセージの組み合わせでは不十分な場合があります。エラーの原因を特定するために、追加のデータが必要になる場合があります。幸い、Rubyで行うのはとても簡単です。 エラーメッセージのカスタマイズ エラーにコンテキスト情報を追加する最も簡単な方法は、それを例外のメッセージに追加することです。以下の例では、例外をキャッチし、新しいメッセージで再発生させています: begin raise foo rescue => e raise e.class, bar end # RuntimeError: bar このアプローチの良い使用例は、テンプレートをレン

  2. TracePointを使用してRubyでの複雑な例外動作を調査する

    特に大規模なアプリでは、例外を除いて何が起こっているのかを理解するのが非常に難しい場合があります。既存のプロジェクト内のコードで作業していると想像してください。例外を発生させると、何か奇妙なことが起こります。たぶん例外は飲み込まれます。たぶん、環境変数が変更されます。例外が別の例外にラップされる可能性があります。 TracePointsを使用して、例外が飲み込まれた場合でも、アプリの例外に関するもう少し情報を取得する簡単な方法を紹介します。 便利な例 Railsのコントローラーとビューの境界は、例外がロジックに反しているように見える1つの場所です。自分で見るのは簡単です。ビューで例外を発生