3

こんにちは私はルビーラックで例外処理を適切に管理する方法について質問がありました。

現在、Sinatra / Rackを使用して軽量APIを構築していますが、すべてのルートで例外が発生する可能性があります(パラメーターの欠落、形式の無効など)。これらの例外をすべてキャッチして、ミドルウェアアプリケーションで処理できるようにしたいと思います。各get、post、put、deleteブロック内でキャッチまたは「レスキュー」したくない(例:post'/ me')

ExceptionHandlerがラックスタックの一番上にあるこのようなものを試しました。

私は何かが足りないのですか?

class Api::ExceptionHandler

  def initialize(application)
    @application = application
  end

  def call(environment)
    @application.call environment
  rescue Api::MissingParameterError => parameter
    [ 400, { }, [ "parameter #{parameter} missing" ] ]
  end

end
4

2 に答える 2

1

Sinatra 1.4バージョン(バージョン0.11以降Padrinoで使用)以降、エラーhttpステータス定義に変更があります。sinatra-1.4.2/lib/sinatra/base.rbこれが「handle_exception!」に関連する部分です。働き


 if boom.respond_to? :http_status    status(boom.http_status)  elsif settings.use_code? and boom.respond_to? :code and boom.code.between? 400, 599      status(boom.code)  else    status(500)  end

したがって、例外クラスに「http_status」メソッドがある場合は、そこからエラーステータスが定義されます。これにより、「raise_errors」および「show_exceptions」設定に応じて、サーバーエラー(コードが500〜599のエラー)のみがミドルウェアに到達できます(少し下の同じ「handle_exception!」関数)。


  return res if res or not server_error?
  raise boom if settings.raise_errors? or settings.show_exceptions?
朗報です。デフォルトのエラーステータスは500です。したがって、ミドルウェアを伝播するために例外が必要な場合は、例外クラスが「http_status」メソッドに応答しないようにするか、500から599までのhttp_statusコードを使用してください。error説明したMaxのような方法を使用します。

于 2013-06-08T10:45:29.677 に答える
0

わかりました、Catnapperが言ったように、上記のコードは機能するはずです!私が言及しなかったことは、私のミドルウェアはすべて、Sinatra::Baseを継承するクラスを継承しているということでした。

また、Sinatraには独自の例外ハンドラーがあり、このように変更できます。

set :raise_errors, false
set :show_exceptions, false

そして、これはsinatraで例外ハンドラーを作成する方法です(質問の例の場合):

error Api::MissingParameterError do |parameter|
  status 400
  headers { }
  body "parameter #{parameter} missing"
end
于 2013-02-11T18:04:54.243 に答える