Ruby中的Fail vs.raise:我们真的应该相信风格指南吗?
Ruby提供了两种以编程方式导致异常的可能性:Ruby中的Fail vs.raise:我们真的应该相信风格指南吗?,ruby,exception,coding-style,conventions,Ruby,Exception,Coding Style,Conventions,Ruby提供了两种以编程方式导致异常的可能性:raise和fail,这两种方法都是Kernel方法。根据文件,它们是绝对等同的 出于习惯,到目前为止我只使用了raise。现在我发现了几个建议(例如),对于要捕获的异常,使用raise;对于不打算处理的严重错误,使用fail 但这真的有意义吗?当您编写一个类或模块,并在内部引发一个问题时(您通过fail发出信号),您的编程同事可能会很高兴地理解您的意图,但使用我的代码的人很可能不会看我的代码,也无法知道,异常是由升高引起的还是由失败引起的。因此,我
raise
和fail
,这两种方法都是Kernel
方法。根据文件,它们是绝对等同的
出于习惯,到目前为止我只使用了raise
。现在我发现了几个建议(例如),对于要捕获的异常,使用raise
;对于不打算处理的严重错误,使用fail
但这真的有意义吗?当您编写一个类或模块,并在内部引发一个问题时(您通过fail
发出信号),您的编程同事可能会很高兴地理解您的意图,但使用我的代码的人很可能不会看我的代码,也无法知道,异常是由升高引起的
还是由失败引起的
。因此,我谨慎地使用raise
或fail
不会对他的决定产生任何影响,不管她是否应该处理它
有人能看出我论点中的缺陷吗?或者是否有其他标准,我可能希望使用fail
而不是raise
对于要捕获的异常使用“raise”,对于不打算处理的严重错误使用“fail”
这不是网站或你提供的链接所说的
这里的意思是仅在rescue
块中使用raise
。也就是说,当你想说某件事情失败时,使用fail
,当你再次抛出异常时,使用raise
至于“重要吗”部分——这不是最严格遵守的核心规则之一,但你可以为任何公约提出同样的论点。您应该按照以下顺序操作:
更新:截至(2015年12月),惯例是始终使用
提升
我曾经就这件事与我进行过一次对话,从那时起,当我的方法由于某种原因显式失败时,我总是使用失败
,并重新抛出异常
这是一篇来自吉姆的帖子(几乎与他本人对我说的一字不差):
以下是这篇文章的相关内容,这篇文章引用了吉姆的话:
以下是我关于异常的基本哲学(以及其他随机想法)
当您调用一个方法时,您对该方法将实现什么有一定的期望。从形式上讲,这些期望被称为后条件。每当方法未能满足其后置条件时,应抛出异常
为了有效地使用此策略,它意味着您必须对契约式设计以及前置和后置条件的含义有一点了解。无论如何,我想知道这是件好事
这里有一些具体的例子。Rails模型save
方法:
model.save!
-- post-condition: The model object is saved.
如果由于某种原因未保存模型,则必须引发异常,因为未满足post条件
model.save
-- post-condition: (the model is saved && result == true) ||
(the model is not saved && result == false)
如果save
没有实际保存,那么返回的结果将是false
,但是post条件仍然满足,因此没有异常
我发现保存很有趣代码>方法有一个非常简单的post条件
关于拯救异常的主题,我认为应用程序应该具有拯救异常的策略点。在大多数情况下,几乎不需要进行救援/再救援。你唯一想拯救和重做的时候是当你已经完成了一半的工作,你想撤销一些东西,所以要避免一个部分完成的状态。应仔细选择您的战略救援点,以便即使当前行动失败,该计划仍能继续进行其他工作。事务处理程序应该直接转到下一个事务。Rails应用程序应该恢复并准备好处理下一个http请求
大多数异常处理程序都应该是泛型的。由于异常表示某种类型的故障,因此处理程序只需决定在发生故障时应做什么。通常不鼓励对非常特定的异常执行详细的恢复操作,除非处理程序非常接近异常点(调用图)
异常不应用于流控制,请使用throw/catch
。这为真实故障条件保留了例外情况
(顺便说一句,因为我使用异常来表示失败,我几乎总是使用fail
关键字,而不是Ruby中的raise
关键字。fail
和raise
是同义词,所以没有区别,除了fail
更清楚地表明方法失败。我唯一一次使用raise
是指我捕捉到异常并重新引发它,因为在这里我没有失败,而是明确地、有目的地引发异常。这是我关注的一个风格问题,但我怀疑其他人是否会这样做)
你看,我对异常的想法有点杂乱无章
我知道有很多风格指南不一致(例如,所使用的).我不在乎。吉姆说服了我。我认为这个问题可以被视为离题,因为它不是一个具体的问题,所以在我看来,它更适合于@m.cekiera,例如,在引用其他网站时,指出@m.cekiera:实际上,这个问题是由一个具体的问题引起的(我正在编写一个库,当传递给方法的参数超出范围时,我想提出一个例外),但我认为提供这些信息无助于回答这个问题。不过,感谢您的评论。感谢您澄清这一点