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