也说说C#的“异常重抛”

简介:

几乎大多数C#程序员都这样写异常处理代码的

代码一:
1 try
2 ExpandedBlockStart.gif {ThrowException();}
3 catch (Exception ex)
4 ExpandedBlockStart.gif {throw ex;}
5 finally
6 ExpandedBlockStart.gif {}

如果你的底层代码还有一个方法用来抛出异常
代码二:
1 public  ThrowException()
2 ExpandedBlockStart.gif {
3throw new Exception("一个底层异常");
4}
那么,你也许需要将这个底层的异常 重新抛出

如果你使用代码一的方式,将会打断异常的堆栈跟踪,在VS2005中的表现是新抛出了一个异常(代码一中的ex),而不是抛出底层异常(代码二中的new Exception("一个底层异常");)

那么怎么才能不打断异常的堆栈跟踪并能重抛底层异常呢,可以这样写。
代码三:
1 try
2 ExpandedBlockStart.gif {
3ThrowException();
4}

5 catch
6 ExpandedBlockStart.gif {
7throw;
8}
这样就能重新抛出代码二中的底层异常。
当然你可以包装一下底层异常。代码如下:
代码四:
try
ExpandedBlockStart.gif
{
 ThrowException();
}

catch (Exception ex)
ExpandedBlockStart.gif
{
 
throw new Exception("被包装后的底层异常",ex);
}
这样不会打断异常堆栈跟踪。
我的理解比较浅,多多指正。

参考资料:http://www.cnblogs.com/1landonsea/archive/2005/01/15/RethrowExceptionInCSharp.html


本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/archive/2007/03/15/675237.html,如需转载请自行联系原作者。

目录
相关文章
|
5月前
|
Java C++ Spring
解决NoUniqueBeanDefinitionException异常的方法
了解Spring框架中`NoUniqueBeanDefinitionException`异常的原因和解决方案。此异常发生在容器内有多个相同类型的bean时,Spring无法决定注入哪个bean。解决方法包括:使用`@Primary`注解标记首选bean,利用`@Qualifier`注解配合`@Autowired`、`@Resource`、`@Inject`或`@Value`指定bean名称。选择哪种方法取决于业务需求和具体场景,预防措施是避免创建多个同类型bean或使用`@Primary`注解。
201 0
|
11月前
|
前端开发 rax Linux
【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常
【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常
116 0
|
安全 Java 程序员
c++异常
c++异常
92 0
|
5月前
|
SQL 安全 Java
C++之异常
C++之异常
20 0
|
10月前
|
安全 Java 程序员
C++ 异常
C++ 异常
39 0
|
存储 监控 Java
认识异常【超详细】
认识异常【超详细】
37 0
|
12月前
|
安全 程序员 C语言
|
程序员 编译器 C语言
【C++】异常,你了解了吗?(一)
在之前的C语言处理错误时,会通过assert和错误码的方式来解决,这导致了发生错误就会直接把程序关闭,或者当调用链较长时,就会一层一层的去确定错误码,降低效率,所以c++针对处理错误,出现了异常,一起来学习!
114 0
|
SQL druid Java
是谁的请求导致我的系统一直抛异常?
在线上环境中,请求错综复杂,如果有某个请求出现了不符合预期的情况,我们往往会先需要确定这个请求在实际环境中是由哪个 Controller 来处理的。通常情况下,我们需要去查阅文档或是代码,这个过程往往比较繁琐,并且不一定是准确的,可能由于一些问题会导致我们的请求没有被预期的 Controller 处理。而借助微服务洞察的能力,能够快速地定位特定的请求在真实环境中是由哪个 Controller 处理的。
是谁的请求导致我的系统一直抛异常?
这一篇让你知道怎么处理异常
这一篇让你知道怎么处理异常
这一篇让你知道怎么处理异常