Railsっていいよね。
今でもPoCプロジェクトではRailsを候補にあげる男です。
今回は、ERBテンプレートを使っていて出くわしたエラーとその解決策。
rescueでキャッチできないコード
普通に書くならこんな感じ。
1 2 3 4 5 |
begin text = ERB.new(File.read(@template_path)).result(binding) rescue => e Rails.logger.error("Error in rendering mail template. #{ e.message }") end |
これだとERBレンダリングの際に、
通常のrescue=>eだとSyntaxErrorをキャッチできない。
1 2 3 |
<% alert = "a" %> <%= alerta %> <=普通の例外で取得 <%= #{alert}内容 %> <= SyntaxError Rails 内で500エラーとなる |
NameError: uninitialized constantといったエラーは取得できるが、
SyntaxErrorはだめだった。
rescueでキャッチするコード
SyntaxErrorをキャッチする場合、
専用に例外を定義する必要があるので下記のように書く。
1 2 3 4 5 6 7 8 9 |
begin text = ERB.new(File.read(@template_path)).result(binding) rescue SyntaxError => se Rails.logger.error("SyntaxError in rendering ERB template. #{ se.message }") text = "#{msg}#{se.message}\n#{se.backtrace.join("\n")}" rescue => e Rails.logger.error("Error in rendering ERB template. #{ e.message }") text = "#{msg}#{e.message}\n#{e.backtrace.join("\n")}" end |
これで、500を起こさずにSyntaxErrorを処理できる。
じゃあねーーー。