我希望这很简单。我在一个大的代码库上工作,整体质量很好,但偶尔你会得到一些:
try
{
// Calls a .NET remoting method.
}
catch
{
throw;
}
请注意,没有最终的逻辑,并且catch没有指定任何异常或执行除上面提供的操作之外的任何其他操作。但是,我知道捕获和重新抛出可以改变异常细节中的调用堆栈。我不确定的是,这种行为是否特别是因为.NET远程调用。
删除这个try-catch是否安全?据我所知,它是,但我认为我会先检查一下所有奇怪的行为。
答案 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也是如此。