【Ruby/サーバサイド】サーバのエラーもレスポンスとして返そう

2016年8月7日Ruby

こんにちは、しきゆらです

自分の中で、絶賛ブログ更新キャンペーン中です

 

それは置いておいて、今回の内容は

「サーバでのエラーもクライアントに返しちゃおう」

というお話です


 

最近は、研究の一環でWebサイトを作っているのですが

サーバ側のエラーを見つけるのに凄く手間取っていました

 

JSからサーバへリクエストをいくつか送り、エラーがいつ起こるのかを調べたり

Apacheのエラーログをみたり・・・

 

エラーが起こるたびにこんなことをやっていては、完成するのは何年かかるのやら・・・

という感じだったのですが

Rubyでのエラー処理を知ってからは割と短く探すことができるようになりました

 

Rubyのエラー処理

公式のリファレンスではこの辺でしょうか

制御構造 #begin

# エラーが起こりそうなところを以下のように囲む
begin
  # なんらかエラーが起こりそうなの処理
rescue
  # エラーが起きた場合の処理
end

簡単に書くと、こんな感じ

 

今まで自分用の小さいスクリプトを書いている時は、エラー処理なんか書いたことがなかったので

こういうのを使い始めたのは本当に最近です

 

ついでに

rescueの部分を

rescue => e

と書くと、エラーオブジェクト(?)がeという変数に入ります

基本的にはこの変数から

  • エラーの内容
  • エラーが発生した部分

などを知ることができます

 

また、rescueのところで

rescue ERROR_TYPE

とすると、エラーのタイプによって処理を分岐させることができるようです

なお、指定しないとStandardErrorを継承したすべてのエラーを捕捉するようです

 

加えて、if文やuntil文などでは修飾子というものがありますが

rescueにも修飾子があるようです

irb(main):001:0> open("hoge") rescue puts "error"
error
=> nil

 

本題

さて、長々と書きましたがここから本題ですが

エラーが起きた部分をクライアントにレスポンスとして返すと探す手間が省けてとても楽です

というお話

begin
  # なんらかの処理 
rescue => e
  # エラーをerror_logというファイルに書き込む
  file = open("./error_log", "a")
  file.write(e.message + "\n")
  file.write(e.backtrace.join("\n"))
  file.write("\n\n")
  file.close

  # エラーをHashに格納し、JSONとして送り返す
  json = Hash.new
  json.store("status", e.message)
  json.store("path", e.backtrace.join("/n"))
  print JSON.generate(json)
end

サーバからのレスポンスをJSONとして返すのが最近のマイブームです

まずはじめに、ファイルにエラー内容を保存します

その後、エラー内容をJSONにしてクライアントへ送り返します

 

これにより、クライアント側のブラウザコンソールを見ているだけで

どこでエラーが起こったのかを知ることができます

あちこち見なくてもいいのでとても楽ですね

 

ついてに、サーバのファイルにも書き込んでいるので

JSONとしてエラーを返す部分を削除したとしても

データは常に残るようになっているので探すのも楽

 

いわゆるtry ~ catchですか

もっと早く気づきたかった・・・

Rubyに触れて今年の冬で丸3年になりますが

使ったことがないとはとてもお恥ずかしい

そんな今日この頃

 

もっといい方法があれば教えてください

では、今回もあっさりしていますがこの辺で

おわり

Posted by しきゆら