捕获异常并在C#中重新抛出 - 它能保持其类型吗?

时间:2015-06-19 17:02:54

标签: c# exception-handling

我们有一个业务关键的遗留代码,方法相对较大,代码很乱。如果没有测试框架并且它如此重要,我们的调试能力就会受到限制。日志消息没有用 - "对象未设置为对象的实例" ...在500行代码中调用其他方法的某处。这是因为方法体是一个很大的尝试/捕获,并且捕获了特定的异常。

我想建议我们通过更好的错误记录来解决这个问题,但我希望尽量减少对方法的影响。我需要它继续照常进行,因为它对业务至关重要。因此,人们害怕接触它,所以在我提出这个想法之前我需要检查一下我的理解。正如我所说的,我不能只是做一个改变并自己测试它而不用编写测试工具。由于消防,我没有时间去做,这是星期五的最后一件事。

我认为一个好方法是在方法体内插入较小的try / catch块来捕获所有异常,记录一些有用的信息,然后重新抛出到下面的特定catch处理程序。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} p=1045$
RewriteRule ^(.*) http://newsite.com/tutorials? [R=301,L] 
RewriteRule ^blog$ http://newsite.com/news/ [R=301,L]
RewriteRule ^news/(.*)$ http://newsite.com/news/$1/ [R=301,L]
RewriteRule ^old-category/(.*)$ http://newsite.com/news/$1/ [R=301,L]
RewriteRule ^(.*)$ http://www.newsite.com/? [R=301,L]
</IfModule>

在我的内部try / catch中,我可以编写与底部匹配的特定catch处理程序,但这看起来会很混乱。

如果我在catch(异常e)和rethrow中捕获CustomException2,它会以catch(CustomException2 e)结束吗?

1 个答案:

答案 0 :(得分:0)

是的,你可以这样做。在你的第一个捕获中,异常被简单地作为基础Exception,但当你重新抛出它时,下一个捕获将捕获它,因为它是真正的类型。

当您重新抛出异常时,请使用throw;而非thrown ex; see here why