好像我有begin ... rescue ... end
我的代码中到处都是语句!这似乎不是正确的做法。
谁能建议我如何捕获任何异常而不必将所有内容都放在里面begin ... rescue ... end
?有什么方法可以让 Ruby 闭嘴并继续前进,即使出现异常也是如此?
与其他语言一样,对于任何重要的程序,您实际上都需要一个经过深思熟虑的架构来处理异常。一种方法是在项目中定义异常处理范围,然后您通常希望在范围边界捕获(救援)异常。这是一个权衡。堆栈中距离异常发生的位置越近,有关触发异常的条件的上下文信息就越多。如果您尝试过于细粒度,则会遇到您所描述的问题。另一方面,如果您只捕获堆栈顶部(在“main”中)的异常,则没有上下文。因此,定义异常处理范围涉及评估与特定程序或系统相关的权衡。
Ruby 为我们提供了“重试”的能力——这是其他一些语言所不具备的。这个应该谨慎使用!但在有意义的情况下(例如等待网络或资源被释放),此类异常需要在本地进行处理。
否则,我倾向于在大型项目中以相当粗粒度的级别定义异常范围。当异常从起始点通过各种异常范围边界冒出时,捕获一些上下文信息通常很有用。为了解决这个问题,您可以通过定义一些您自己的特定于应用程序的异常类型来扩展 Ruby 异常类层次结构,但同样需要权衡。您的项目应该有关于何时使用自定义异常类型与在消息字段中捕获上下文数据、消息字段应包含什么类型的信息等的明确标准,以及对代码可以生成的消息进行编目的策略。
在大多数情况下,可以允许异常向上传播到集中处理程序,进行记录(供技术团队和支持人员使用),为用户生成有用的错误消息,并确定情况是否严重到需要您的程序退出。一般来说,所有异常都应该在您的代码或您正在使用的应用程序框架内进行处理。不应允许任何异常逃逸到语言运行时或操作系统的默认异常处理。
这些是我的想法,主要基于其他语言的经验,但我认为它们非常普遍。最重要的是,在大型项目中,您需要投入大量精力来设计异常处理,而不是临时方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)