Techioz Blog

Sinatra API で例外を適切に処理する方法

概要

Sinatra で一時 CSV ファイルをパラメータとして受け入れる API を作成しようとしています。ファイルタイプが text/csv ではない場合、または CSV に電子メール列がない場合に例外を発生させ、確認ページに単にエラー メッセージを表示するようにしたいと考えています。私は次のようなものを想像しました:

if params[:recipients_file]
  raise ArgumentError, 'Invalid file. Make sure it is of type text/csv.' unless params[:recipients_file][:type] == "text/csv"
  recipients_csv = CSV.parse(params[:recipients_file][:tempfile].read, {headers: true})
  raise ArgumentError, 'Invalid CSV. Make sure it has an "email" column' unless recipients_csv.headers.include?('email')
  recipients += recipients_csv.map {|recipient| recipient["email"]}
end

ただし、これらの条件のいずれかが満たされない場合は、NoMethodErrors などの非常に見苦しいエラー メッセージが表示されます。API の実行を停止して、確認ページにエラー メッセージを返すようにしたいだけです。どうすればいいでしょうか?

解決策

エラーブロックを定義する必要があります。

error do
  env['sinatra.error'].message
end

さまざまな例外タイプや HTTP ステータス コードなどにさまざまなエラー ハンドラを設定する方法など、詳細については http://www.sinatrarb.com/intro.html#Error を参照してください。