没有在catch块中进行额外处理的try-catch-rethrow的原因是什么?

本文关键字:try-catch-rethrow 处理 是什么 catch | 更新日期: 2023-09-27 18:19:00

有时我在探索ServiceStack的代码库时会遇到以下构造:

try
{
   ...
}
catch (Exception)
{
   throw;
}
在我看来,这种结构没有任何作用。这样做的可能原因是什么?

没有在catch块中进行额外处理的try-catch-rethrow的原因是什么?

你是对的-这通常是毫无意义的。我看到有人包括它,这样他们就可以在throw行上放置一个断点(这样他们就可以看到异常何时被抛出,即使他们通常不会在异常上中断)。不幸的是,它经常在调试会话结束后被留在那里。

如果你在你控制的代码库中遇到这种情况,我建议你删除它。

上次我遇到这样的结构时,我问作者为什么。我特别好奇的是,他并非毫无意愿地这样做,而只是在少数几个地方这样做。

他的回应是"让异常成为例外",我猜他一定是从Eric Lippert那里学来的,Eric Lippert补充说,他的大多数方法不会/(应该)永远不会抛出他的代码在某些地方可能抛出的错误。通过添加try/catch/throw,他向维护者传达了他已经认识到这种情况可能发生的信息。

很自然地,我们试着写出一点都不会爆炸的代码。例如,通过使用代码契约,实际可以抛出的方法的数量大大减少。