アプリケーションの例外処理


伝播の層を通しての迅速なツアー


我々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の特別なルビーを読んでみました私は非常にそれを拾うことを推奨し、さらにパワーと例外の落とし穴を理解するために読むことを与える.