本身并不可怕,但需要注意嵌套的层数。
可以接受的使用情况如下:
我是一个较低级别的组件,可能会遇到多种不同的错误,但我的消费者只关心特定类型的异常。因此,我可以这样做:
catch(IOException ex)
{
throw new PlatformException("some additional context", ex);
}
现在这个功能允许用户做到以下几点:
try
{
component.TryThing();
}
catch(PlatformException ex)
{
}
是的,我知道有些人会说消费者应该捕获IOException,但这取决于使用代码的抽象程度。如果实现正在保存某些内容到磁盘上,并且消费者没有充分的理由认为他们的操作将触及磁盘,那么在这种情况下,在消费者代码中放置此异常处理就毫无意义。
通常,我们使用此模式时要避免在业务逻辑代码中放置“捕获所有”异常处理程序,因为我们想找出所有可能的异常类型,因为它们可能导致需要调查的更根本的问题。如果我们不捕获异常,它会向上冒泡,触及“顶部”的处理程序并应该停止应用程序继续运行。这意味着客户端将报告该异常,并且您将有机会进行调查。当您尝试构建强大的软件时,这非常重要。您需要找到所有这些错误情况并编写特定的代码来处理它们。
不太美观的是嵌套这些异常过多,这是您应该使用此代码解决的问题。
正如另一位发帖者所述,异常用于合理的异常行为,但不要走得太远。基本上,代码应表达“正常”操作,异常应处理您可能遇到的潜在问题。
在性能方面,异常很好,如果您使用调试器对嵌入式设备进行性能测试,则会得到可怕的结果,但是在没有调试器的情况下发布时,它们实际上非常快。
当讨论异常性能时,人们经常忽略的主要事项是,在错误情况下,一切都会变慢,因为用户遇到了问题。当网络关闭并且用户无法保存其工作时,我们真的关心速度吗?我非常怀疑在几毫秒内更快地将错误报告返回给用户是否会有所不同。
讨论异常时要记住的主要准则是:异常不应在正常应用程序流程中发生(正常意味着没有错误)。其他所有内容都源于该语句。
在您提供的确切示例中,我不确定。在我的看来,从一个听起来很普通的tcl异常中包装另一个听起来很普通的tcl异常并没有真正获得任何好处。如果有什么区别,我建议追踪代码的原始创建者并了解他的想法是否有任何特定的逻辑。不过,可能只需删除catch即可。