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

Ada*_*rth 24 .net c# exception-handling .net-remoting

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

try
{
   // Calls a .NET remoting method.
}
catch
{
   throw;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 22

重新抛出,你已经证明它不应该改变调用堆栈,除非有一些关于远程处理异常很特别.(我知道有一些特殊的方面,但我认为它们不会在这里发挥作用.)这种情况确实会丢失信息:

catch(Exception e)
{
    throw e; // Not throw;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 只使用`throw`仍然可以改变堆栈跟踪**如果**异常在与`throw`语句相同的堆栈帧中抛出 - 在这种情况下,行号被重置为`throw`语句的行(而不是最初抛出异常的行) (3认同)
  • 它已经摆脱,我现在需要的是一个不起眼的缺陷号码来检查它:-) (2认同)

aba*_*hev 14

据我所知,catch (Exception ex) { throw ex }重置堆栈跟踪.而catch { throw; }事实并非如此.

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


Cod*_*aos 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:v2.0中的模拟和异常过滤器以来似乎已经过时了