/ ruby

Ruby's Exception vs StandardError: 有什麼不一樣?

參考源於此:http://blog.honeybadger.io/ruby-exception-vs-standarderror-whats-the-difference/

「Never rescue Exception in Ruby」
或許你可曾聽過這句話,但若不知道 Exception 與 Standard Error 的差別還真是讓人摸不著頭緒。

通常我們會在 Ruby 這樣 rescue exceptions

begin
  do_something()
rescue => e
  puts e # e is an exception object containing info about the error.
end

但在看到這張表後馬上明白為什麼不能這樣寫

Exception
 NoMemoryError
 ScriptError
   LoadError
   NotImplementedError
   SyntaxError
 SignalException
   Interrupt
 StandardError
   ArgumentError
   IOError
     EOFError
   IndexError
   LocalJumpError
   NameError
     NoMethodError
   RangeError
     FloatDomainError
   RegexpError
   RuntimeError
   SecurityError
   SystemCallError
   SystemStackError
   ThreadError
   TypeError
   ZeroDivisionError
 SystemExit
 fatal

可以看到 StandardError 只是 Exception 的一個子類別而已,所以當我們若 rescue 整個 exception 類別,會發現「ScriptError::SyntaxError」、「NoMemoryError」這種最常 typo 的錯誤就都跑進去 rescue 裡面了,開發時都不會發現,大概要功能上線後發現怎都沒資料才會注意到吧(笑

所以應該這樣寫:

begin
  do_something()
rescue StandardError => e
  # Only your app's exceptions are swallowed. Things like SyntaxErrror are left alone.
end