【发布时间】:2020-02-11 19:58:05
【问题描述】:
除了不让我的程序崩溃并继续工作之外,还有其他原因可以处理rescue 的异常吗?
【问题讨论】:
-
我认为没有程序崩溃是一个巨大的优势。我不确定您期望什么样的答案?例如:向用户返回正确的错误消息,处理错误并且不要失败,清理你在崩溃之前所做的一些事情......?类似的东西?
除了不让我的程序崩溃并继续工作之外,还有其他原因可以处理rescue 的异常吗?
【问题讨论】:
没有人强迫你挽救异常。如果你愿意,你可以让它燃烧,在某些情况下,这是一个完全可行的策略。有时,与其得过且过似的继续前进,不如崩溃好。
在记录异常并自动重新启动进程的系统中,这可能是可行的方法。
您最不想做的事情是在rescue 中卡住,这只会出现一些晦涩难懂的问题,或者更糟的是,会使系统处于不稳定或无法工作的状态。这相当于断开火警警报,因为它很烦人并且偶尔会发出哔哔声。有一天你会需要它,因为正在发生一些严重的事情。
大多数情况下,异常会传达一些有用的信息,它们不会造成麻烦。像这样:
class ConfigDataError < StandardError
# Defines a custom exception class
end
def config_data(path)
YAML.load(File.open(path))
rescue Errno::ENOENT
# File is missing, no big deal.
{ }
rescue Psych::SyntaxError
# This is a problem!
raise ConfigDataError, "Invalid YAML in file #{path}"
end
您可以针对某些类型的预期异常以及能够将其他异常重新引发为新类型。
【讨论】: