- 异常 (Exceptions)
异常 (Exceptions)
不要把异常用于控制流里 (flow of control)
[link]# 错误beginn / drescue ZeroDivisionErrorputs "Cannot divide by 0!"end# 正确if d.zero?puts "Cannot divide by 0!"elsen / dend
避免捕捉
Exception这个大类的异常
[link]# 错误begin# an exception occurs hererescue Exception# exception handlingend# 正确begin# an exception occurs hererescue StandardError# exception handlingend# 可以接受begin# an exception occurs hererescue# exception handlingend
传 2 个参数调 raise 异常时不要明确指明
RuntimeError。尽量用 error 子类这样比较清晰和明确。[link]# 错误raise RuntimeError, 'message'# 正确一点 - RuntimeError 是默认的raise 'message'# 最好class MyExplicitError < RuntimeError; endraise MyExplicitError
尽量将异常的类和讯息两个分开作为
raise的参数,而不是提供异常的实例。[link]# 错误raise SomeException.new('message')# 注意,提供异常的实例没办法做到 `raise SomeException.new('message'), backtrace`.# 正确raise SomeException, 'message'# 可以达到 `raise SomeException, 'message', backtrace`.
避免使用 rescue 的变异形式。
[link]# 错误read_file rescue handle_error($!)# 正确beginread_filerescue Errno:ENOENT => exhandle_error(ex)end
