注册
登录
Ruby
为什么在Ruby中使用`rescue Exception => e`样式不好?
返回
为什么在Ruby中使用`rescue Exception => e`样式不好?
作者:
狗头军师
发布时间:
2024-12-12 05:03:52 (26天前)
Ryan Davis的Ruby QuickRef说(没有解释):
Don’t rescue Exception. EVER. or I will stab you.
为什么不?正确的做法是什么?
收藏
举报
2 条回复
1#
回复此人
v-star*위위
|
2020-07-29 16-05
TL; DR:StandardError改为用于常规异常捕获。重新引发原始异常时(例如,在救援时仅记录异常),救援Exception可能就可以了。 Exception是根Ruby的异常层次结构,所以当你rescue Exception从拯救一切,包括子类,如SyntaxError,LoadError和Interrupt。 救援Interrupt可以防止用户CTRLC用来退出程序。 抢救会SignalException阻止程序正确响应信号。除以外,它将是不可杀死的kill -9。 救援SyntaxError意味着eval失败的s会默默地执行。 所有这些都可以通过运行这个程序,并试图显示CTRLC或者kill它: ``` loop do begin sleep 1 eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure" rescue Exception puts "I refuse to fail or be stopped!" end end ``` 救援Exception甚至不是默认设置。在做 ``` begin # iceberg! rescue # lifeboats end ``` 不营救Exception,而是营救StandardError。通常,您应该指定比default更为具体的内容StandardError,但是从中抢救可以Exception 扩大范围而不是缩小范围,并且可能会导致灾难性的结果,并且使错误查找极为困难。 如果您确实想从中解脱,StandardError并且需要一个例外的变量,则可以使用以下形式: ``` begin # iceberg! rescue => e # lifeboats end ``` 等效于: ``` begin # iceberg! rescue StandardError => e # lifeboats end ``` 从Exception日志记录/报告目的中可以挽救过来的几种常见情况之一,在这种情况下,您应该立即重新引发异常: ``` begin # iceberg? rescue Exception => e # do some logging raise # not enough lifeboats ;) end ```
编辑
登录
后才能参与评论