这本身并不可怕,但人们应该真正注意筑巢。
可接受的用例如下:
我是一个低级组件,可能会遇到许多不同的错误,但是我的消费者只对特定类型的异常感兴趣。因此我可以这样做:
catch(IOException ex)
{
throw new PlatformException("some additional context", ex);
}
现在,这允许消费者执行以下操作:
try
{
component.TryThing();
}
catch(PlatformException ex)
{
// handle error
}
是的,我知道有些人会说,但是消费者应该捕获 IOException ,但这取决于消费代码的实际抽象程度。如果 Impl 正在将某些内容保存到磁盘并且消费者没有正当理由认为他们的操作会触及磁盘怎么办?在这种情况下,将此异常处理放在消费代码中是没有意义的。
通过使用这种模式,我们通常试图避免的是在业务逻辑代码中放置一个“包罗万象”的异常处理程序,因为我们想找出所有可能的异常类型,因为它们可能会导致需要解决的更基本的问题进行了调查。如果我们没有捕捉到,它就会冒泡,到达“顶级”级别的处理程序,并且应该停止应用程序继续运行。这意味着客户将报告该异常,您将有机会对其进行调查。当您尝试构建强大的软件时,这一点很重要。您需要找到所有这些错误情况并编写特定的代码来处理它们。
不是很漂亮的是嵌套过多,这就是你应该用这段代码解决的问题。
正如另一张海报所说,例外是合理的异常行为,但不要走得太远。基本上,代码应该表达“正常”操作,异常应该处理您可能遇到的潜在问题。
在性能异常方面很好,如果您使用调试器对嵌入式设备进行测试,您将得到可怕的结果,但在没有调试器的版本中,它们实际上非常快。
人们在讨论异常的性能时忘记的主要事情是,在错误情况下,一切都会变慢,因为用户遇到了问题。当网络中断并且用户无法保存他们的工作时,我们真的关心速度吗?我非常怀疑以几毫秒的速度将错误报告返回给用户是否会有所作为。
讨论异常时要记住的主要准则是异常不应发生在正常的应用程序流程中(正常意味着没有错误)。其他一切都源于该声明。
在您给出的确切示例中,我不确定。在我看来,将看似通用的 tcl 异常包装在另一个通用的听起来 tcl 异常中并没有真正获得任何好处。如果有的话,我建议追踪代码的原始创建者并了解他的想法背后是否有任何特定的逻辑。虽然你可能会杀死捕获物。