【Ruby/サーバサイド】サーバのエラーもレスポンスとして返そう
こんにちは、しきゆらです
自分の中で、絶賛ブログ更新キャンペーン中です
それは置いておいて、今回の内容は
「サーバでのエラーもクライアントに返しちゃおう」
というお話です
最近は、研究の一環でWebサイトを作っているのですが
サーバ側のエラーを見つけるのに凄く手間取っていました
JSからサーバへリクエストをいくつか送り、エラーがいつ起こるのかを調べたり
Apacheのエラーログをみたり・・・
エラーが起こるたびにこんなことをやっていては、完成するのは何年かかるのやら・・・
という感じだったのですが
Rubyでのエラー処理を知ってからは割と短く探すことができるようになりました
Rubyのエラー処理
公式のリファレンスではこの辺でしょうか
# エラーが起こりそうなところを以下のように囲む 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年になりますが
使ったことがないとはとてもお恥ずかしい
そんな今日この頃
もっといい方法があれば教えてください
では、今回もあっさりしていますがこの辺で
おわり