为什么“拯救例外=&gt”是一种糟糕的风格;用红宝石做的?

Ryan Davis的Ruby QuickRef说(没有解释):

不要拯救例外。曾经否则我会刺你

为什么不呢?正确的做法是什么

TL;DR:使用标准错误代替常规异常捕获。重新引发原始异常时(例如,当救援以仅记录异常时),救援异常可能没问题


Exception是Ruby异常层次结构的根,因此当您rescue Exception时,您可以从一切中解救出来,包括SyntaxErrorLoadError中断等子类

救援中断可防止用户使用CTRLC退出程序

救援SignalException会阻止程序正确响应信号。除非通过kill-9,否则它是不可修改的

拯救SyntaxError意味着失败的evals将以静默方式进行

所有这些都可以通过运行此程序并尝试CTRLCkill来显示:

循环执行
开始
睡眠1
评估“djsakru3924r9eiuorwju3498+=5u84fior8u8t4ruyf8ihiure”
救援例外
写上“我拒绝失败或被阻止!”
终止
终止

异常中营救甚至不是默认设置。做

开始
#冰山!
营救
#救生艇
终止

不从异常中救援,它从标准错误中救援。通常,您应该指定比默认的StandardError更具体的内容,但是从异常中营救会扩大范围,而不是缩小范围,并且可能会产生灾难性的结果,并使错误查找变得极其困难


如果您确实希望从StandardError中解救,并且您需要一个例外变量,则可以使用以下表格:

开始
#冰山!
救援=>E
#救生艇
终止

这相当于:

开始
#冰山!
救援标准错误=>E
#救生艇
终止

异常中营救正常的少数常见情况之一是出于日志记录/报告目的,在这种情况下,您应该立即重新引发异常:

开始
#冰山?
救援例外=>E
#做些日志记录
升起(救生艇不够)
终止

发表评论