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 を参照してください。