Ryan Davis的Ruby QuickRef说(没有解释):
不要拯救例外。曾经否则我会刺你
为什么不呢?正确的做法是什么
TL;DR:使用标准错误代替常规异常捕获。重新引发原始异常时(例如,当救援以仅记录异常时),救援异常可能没问题
Exception是Ruby异常层次结构的根,因此当您rescue Exception时,您可以从一切中解救出来,包括SyntaxError、LoadError和中断等子类
救援中断可防止用户使用CTRLC退出程序
救援SignalException会阻止程序正确响应信号。除非通过kill-9,否则它是不可修改的
拯救SyntaxError意味着失败的evals将以静默方式进行
所有这些都可以通过运行此程序并尝试CTRLC或kill来显示:
循环执行
开始
睡眠1
评估“djsakru3924r9eiuorwju3498+=5u84fior8u8t4ruyf8ihiure”
救援例外
写上“我拒绝失败或被阻止!”
终止
终止
从异常中营救甚至不是默认设置。做
开始
#冰山!
营救
#救生艇
终止
不从异常中救援,它从标准错误中救援。通常,您应该指定比默认的StandardError更具体的内容,但是从异常中营救会扩大范围,而不是缩小范围,并且可能会产生灾难性的结果,并使错误查找变得极其困难
如果您确实希望从StandardError中解救,并且您需要一个例外变量,则可以使用以下表格:
开始
#冰山!
救援=>;E
#救生艇
终止
这相当于:
开始
#冰山!
救援标准错误=>;E
#救生艇
终止
从异常中营救正常的少数常见情况之一是出于日志记录/报告目的,在这种情况下,您应该立即重新引发异常:
开始
#冰山?
救援例外=>;E
#做些日志记录
升起(救生艇不够)
终止