当前位置: 首页 > 知识库问答 >
问题:

为什么Ruby中的`rescreve Exception=>E`是不好的样式?

孔和畅
2023-03-14

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

不营救例外。永远不会。不然我就捅你一刀。

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

共有1个答案

司徒正信
2023-03-14

TL;DR:使用standarderror代替常规异常捕获。当重新引发原始异常时(例如,当进行营救以仅记录异常时),营救exception可能是可以的。

exception是Ruby异常层次结构的根,因此当您reception exception时,您可以从所有内容中进行拯救,包括诸如syntaxerrorloaderrorinterrup等子类。

挽救中断可防止用户使用CtrlC退出程序。

抢救signalexception会阻止程序正确响应信号。除非被杀死-9杀死,否则它是不可杀死的。

拯救syntaxerr意味着失败的eval将以静默方式执行。

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

loop do
  begin
    sleep 1
    eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure"
  rescue Exception
    puts "I refuse to fail or be stopped!"
  end
end

异常中解救甚至不是默认值。做

begin
  # iceberg!
rescue
  # lifeboats
end

不从exception中解救,而是从standarderror中解救。您通常应该指定比默认的standarderror更具体的内容,但是从exception中进行救援会扩大而不是缩小范围,并且可能会产生灾难性的结果,使bug查找变得极其困难。

如果您确实想要从standarderror中进行救援,并且需要一个带有异常的变量,则可以使用以下html" target="_blank">表单:

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
 类似资料:
  • 问题内容: 我问了一个一般性的Spring问题:自动播发Spring Bean,并让多个人回答说应尽可能避免调用Spring 。这是为什么? 我还应该如何访问配置了Spring创建的Bean? 我在非Web应用程序中使用Spring,并计划按照LiorH的描述访问共享对象。 修正案 我接受下面的答案,但这是Martin Fowler的另一种选择,他讨论了依赖注入与使用(本质上与调用相同)的优点。

  • 我有一个问题,关于什么是正确的做法,使用SwingU实用程序的调用稍后方法。 所以首先,我想确认我理解正确。 据我所知,对GUI的更改必须在EDT上完成,因为Swing组件不是线程安全的。invokeLater方法将Runnable作为参数,该Runnable中包含的任何内容都将在EDT上运行。因此,对Swing组件的任何调用都被放入一种队列中,在EDT上一次执行一个。 有了这些,我的问题是:使用

  • 问题内容: 是否要保持与旧版本(未生成)的向后兼容性?还是我缺少一个更微妙的细节?我在()中也看到了这种模式,但是归纳为。 问题答案: 之所以使用,是因为它匹配的对象不必与您传递给的对象具有相同的类型;它只要求它们相等。根据规范,如果存在这样的对象,则返回true。请注意,没有什么要求,并且必须是相同的类型。这是因为该方法接受一个as参数,而不仅仅是与该对象相同的类型。 尽管通常已经定义了许多类,

  • 出发地:https://github.com/brandon-rhodes/luca/blob/master/requirements.txt 最后一行是做什么的?

  • 我听到一些人说,即使在使用获得种子之后,使用也是很糟糕的。为什么会这样?我想知道事情是怎么发生的...抱歉,我又问了一个问题..但是,有什么办法可以替代这一点呢?

  • 在JWKS中是什么意思-Json Web Key Set