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

时间:2011-06-29 08:26:57

标签: c# .net exception-handling .net-remoting

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

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

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

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

4 个答案:

答案 0 :(得分:22)

重新启动,因为你已经显示它不应该改变调用堆栈,除非有一些非常特殊的远程异常。 (我知道有一些特殊方面,但我不认为它们会在这里发挥作用。)这是 失去信息的那种东西:

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

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

答案 1 :(得分:14)

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

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

答案 2 :(得分:5)

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

重点是防止异常过滤器在增加权限时运行。

一些相关文章:

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以来似乎已经过时了 Impersonation and Exception Filters in v2.0

答案 3 :(得分:1)

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

因此,"可以" 在其他地方依赖的副作用。

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

请参阅Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks甚至早于这个老问题。

虽然代码似乎是多余的,但try-catch代码won't be eliminated during compilation也是如此。