アプリケーションの例外処理
3113 ワード
伝播の層を通しての迅速なツアー
我々Forem code base つのプライマリ例外処理戦略があります.
取扱い戦略
インライン
以下はすべての例外を処理する関数の例です.の一部ならば
do_something
例外を発生させます.何でも
my_function
は処理を継続する.def my_function
do_something
rescue => e
logger.error(e)
end
別のバリエーションは、特定の例外をキャプチャすることです.def my_function
do_something
rescue NoMethodError => e
logger.error(e)
end
上の例では、コードのみハンドルNoMethodError
例外.If the do_something
メソッドARuntimeError
例外は、我々の救助は、この例外を処理しません.例外を指定すると、Resultは例外オブジェクトの継承を考慮します.The
rescue
は、NoMethodError
クラス.コントローラまで伝播する
Railsでは、コントローラレベルでハンドル例外を追加できます.以下を参照してください.
class UsersController
rescue_from ActiveRecord::NotFoundError, with: :not_found
def show
@user = User.find(params[:id])
end
private
def not_found
render "404.html", status: 404
end
end
参照 rescue_from
method documentation 詳細は特定の注意のドキュメントの最終行です.「例外ハンドラ内で発生した例外は伝播されません.」これは、
rescue_from
, そして、開発中のものを見ていると、ブラウザで例外が表示されません.アプリケーションの処理への伝播
インラインも使用しない場合
rescue_from
, あなたの例外は、アプリケーションにバブルアップします.そして、どんな設定なしでも、あなたのサイトを訪問する人々はデフォルトRails例外ページを見ます.アプリケーションレベルで例外を処理するには、アプリケーションの
./config/application.rb
.以下の例では、すべての"pundit ::notauthorizederror "例外がコールされます
not_found
リクエストを処理したコントローラのメソッド.config.action_dispatch.rescue_responses["Pundit::NotAuthorizedError"] = :not_found
これが最初の設定です.番目の部分は、構成に別の部分を追加することです設定したいconfig.consider_all_requests_local
.あなたはよく次のように表示されます
./config/environments/production.rb
.config.consider_all_requests_local = false
これは、Railsを見るために柵を構成していることを意味しますconfig.action_dispatch.rescue_responses
を呼び出し、対応するメソッドを呼び出します.言い換えれば、私たちの生産ユーザーに醜い例外を表示しないでください.私たちが500のエラーページを示すのを確実にする他の構成があります、しかし、それはこのポストの範囲の外です.しかし、開発環境(例えば)で.
./config/environments/development.rb
) その値はしばしばtrueに設定されます.つまり、私たちは柵を無視してconfig.action_dispatch.rescue_responses
そして、ブラウザで醜い、しばしば有用な、例外をレンダリングします.結論
どちらを使いますか.それは違います.あなたが例外に遭遇する場所からさらに離れて、あなたは考慮しなければなりません.
まず、もしあなたがラインを救助することができます、それは素晴らしいです.しかし、多分、あらゆる救出をインラインにしないでください
ActiveRecord::RecordNotFound
例外?私の好みは
rescue_from
; それは“常にオン”です.そして、それは呼び出しスタックを隠していることを意味します何か私の開発作業に便利見つける.しばらく前に、Avdi Grimmの特別なルビーを読んでみました私は非常にそれを拾うことを推奨し、さらにパワーと例外の落とし穴を理解するために読むことを与える.
Reference
この問題について(アプリケーションの例外処理), 我々は、より多くの情報をここで見つけました https://dev.to/devteam/application-exception-handling-in-rails-1pbhテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol