我可以用throw删除空捕获吗?

我希望这很简单。 我在一个大型代码库上工作,整体质量很好,但偶尔你会得到一些:

try { // Calls a .NET remoting method. } catch { throw; } 

请注意,没有最终的逻辑,catch没有指定任何exception或除了我上面提供的内容之外做任何其他操作。 但是,我知道捕获和重新抛出可以改变exception细节中的调用堆栈。 我不确定的是,这种行为是否特别是因为.NET远程调用。

删除这个try-catch是否安全? 据我所知,它是,但我想我会先检查一下奇怪的行为。

据我所知, catch (Exception ex) { throw ex }重置了堆栈跟踪。 然后catch { throw; } 没有。

因此,如果您没有对错误执行任何其他逻辑,例如日志记录,我不知道有任何理由不删除该捕获。

如你所示,它不应该改变调用堆栈,除非有一些关于远程exception的非常特殊的东西。 (我知道有一些特殊的方面,但我认为它们不会在这里发挥作用。)这种情况确实会丢失信息:

 catch(Exception e) { throw e; // Not throw; } 

我的猜测是,一些开发人员已将其包括在内,以便他们可以在throw线上设置断点。 我会摆脱它。

在与代码访问安全性相关的某些情况下,catch-rethrow子句可以是必要的安全function。 但我怀疑它适用于此。 特别是因为没有理智的人会使用这种模式而不添加评论。

其重点是防止exceptionfilter在增加权限时运行。

一些相关文章:

http://blogs.msdn.com/b/shawnfa/archive/2005/03/31/404320.aspx
http://msdn.microsoft.com/en-us/library/8cd7yaws(v=VS.100).aspx
http://www.pluralsight-training.net/community/blogs/keith/archive/2005/03/31/7149.aspx


从.net 2开始似乎已经过时了:
v2.0中的模拟和exceptionfilter

虽然在大多数情况下,它可能是冗余/不必要的代码,但try { .. } catch { throw; } try { .. } catch { throw; } 可以抑制编译器优化和JIT方法内联。 这主要出现在调用堆栈跟踪中。

因此, “可能”一种依赖于其他地方的副作用。

可以说,“错误”将依赖于此实现细节,特别是没有关于此类预期行为的明确文档……特别是因为这不是保证。

请参阅发布IS NOT调试:发布构建调用堆栈中的64位优化和C#方法内联,甚至早于这个旧问题。

虽然代码似乎是多余的,但编译期间也不会消除 try-catch代码。