2012-01-19 13 views
2

私の使用例はsinatraでのエラー処理です。 sinatra.error変数は、エラーが発生した場合は、明示的に例外sinatraで停止を呼び出すとsinatra.errorが設定されません

get '/' do 
    raise "Fail the request" 
end 

を上げることによって細かい設定されます。しかし停止が終了するために使用されている場合

error 0..600 do 
    @@logger.error("error reason #{env['sinatra.error']}") 
end 

次のようにこのために私は、エラーハンドラを設定していますその要求はsinatra.errorに設定されません。 sinatraコードを見ると、これは予期したように見えます。なぜなら、投げてしまうと、制御フローが起動してsinatra.error変数の設定をバイパスするからです。

私の質問は、エラーハンドラでエラーの原因を取得できるように、エラーハンドラを停止とともに使用する方法です。

答えて

2

あなたが見ている動作は、haltの目的に由来すると思います。あなたがそれを呼び出すと、必ずしも間違ってシグナルを送るわけではありません。実行を直ちに停止したいだけです。これは特にフィルタで役に立ちます。 SinatraのREADMEをチェックすると、haltを使用して、「フィルタまたはルート内の要求を直ちに停止する」と表示されます。あなたは通常、エラーのためにそれを行うでしょう。

また、定義したエラーハンドラは、エラーが発生したときだけでなく、ステータス200のものも含めて通常のリクエストが処理されたときに呼び出されることにも注意してください。また、env[sinatra.error]も設定されません。

エラーハンドラでできることは、例外をチェックし、利用できない場合はレスポンスコードを確認することです。たとえば(これは古典的なアプリケーションであることに注意):

error 0..600 do 
    boom = @env['sinatra.error'] 
    status = response.status 
    case 
    when boom != nil 
    puts 'exception: ' + boom 
    when status != 200 
    puts 'error: ' + status 
    end 
end 

1つの結果は、両方が200のステータスコードを生成するため、このハンドラに、通常要求は、haltによって中断されるものと区別できない、ということです。ただし、haltを使用してエラーを報告している場合は、とにかく500のようなエラーコードを使用する必要があります。

関連する問題