2018年1月23日火曜日

Sinatra で 500 エラーをハンドリングする方法

概要

前回 not_found を使ってルーティングしていないパスのエラーハンドリングをしました
今回は予期しないエラーが発生したときにすべてのエラーをハンドリングすることができる方法を紹介します

環境

  • macOS 10.13.2
  • Ruby 2.4.1p111
  • Sinatra 2.0.0

サンプルコード

  • vim error.rb
require 'sinatra'
set :show_exceptions, false

get '/' do
  raise
end

error do
  'error'
end

これでアクセスするとクライアント側にはステータスコード 500 で error という文字列だけが返ります
サーバ側には Ruby のエラースタックトレースが表示されます
set :show_exceptions, false これを指定しないとクライアント側にもエラースタックトレースが表示されてしまい本来返却したいレスポンスボディにならないので必ず設定してください

サンプルコード2

  • vim error2.rb
require 'sinatra'
require './my_class.rb'

set :show_exceptions, false

get '/' do
  mc = MyClass.new
  mc.error
end

error do
  'error'
end
  • vim my_class.rb
class MyClass
  def error
    a = nil
    a.each {}
  end
end

MyClass では必ずエラーが発生します
これを Sinatra のコントローラ側でコールしてもちゃんと error が拾ってくれます

最後に

Sinatra で 500 エラーをハンドリングしてみました
とりあえずこれを入れておけば Ruby のエラースタックトレースが返ることはなくなると思います

参考サイト

0 件のコメント:

コメントを投稿