二十 异常和状态管理

 异常

 1 try
2 {
3 //要捕获的代码
4 }
5 catch (Exception ex)
6 {
7 //如果上面的代码段缩了 做什么
8 }
9 finally
10 {
11 //不管错没错 都要做得
12 }




关于throw

 1    public static void Main()
2 {
3 try
4 {
5 a();
6 }
7 catch (Exception ex)
8 {
9 throw;
10 }
11 }
12
13 public static void a()
14 {
15 try
16 {
17 var o = "a";
18 var o1 = Int32.Parse(o);
19
20 }
21 catch (Exception ex)
22 {
23 throw;
24 }
25 }
在a() 中报错 catch throw 会通知高一层的代码
然后 就在Main catch 中报错了

throw 和 throw ex
throw
System.FormatException: 输入字符串的格式不正确。
在 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
在 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
在 System.Int32.Parse(String s)
在 Program.a() 位置 :行号 47
在 Program.Main() 位置 :行号 24


throw ex
System.FormatException: 输入字符串的格式不正确。
在 Program.a() 位置 :行号 47
在 Program.Main() 位置 :行号 24
throw 是直接抛出异常
throw ex 是抛出一个新异常,在抛出一个新异常的时候 stackTrace会被初始化为null
这就是为什么throw ex 会少了一段

往往抛出异常需要一些说明什么
catch(Exception ex)
{
   throw new ApplicationException("说明", ex);
}
这样既有 堆栈信息,同样可以传递说明


关于finally
 1     public static void Main()
2 {
3 try
4 {
5 a();
6 }
7 catch (Exception ex)
8 {
9
10 }
11 finally
12 {
13 Console.WriteLine("1");
14 }
15 Console.ReadKey();
16 }
17
18 public static void a()
19 {
20 try
21 {
22 var o = "a";
23 var o1 = Int32.Parse(o);
24
25 }
26 catch (Exception ex)
27 {
28
29 }
30 finally {
31 Console.WriteLine("2");
32 }
33 }
clr 一旦找到 匹配的catch 就会执行内层中所有的finally

于是这里输出了
2
1

lock,using,foreach,西勾起方法. 都会自动清理

System.Exception

任何捕捉类型要必须从System.Exception 派生

自定义异常类

这里有一个实例


这里书上谈到了 内存错误上

作者重申 .net 不是不让捕捉 OutOfMemoryException

然后 又开始谈 健壮性 安全性 和 开发效率的平衡点

然后给我的感觉就是

“你那么重视健壮性 安全性 用什么 .net啊!!!!!!!!!”

哈哈哈哈哈

关于使用

不要所有异常都捕获

1 try
2 {
3
4 }
5 catch (Exception)
6 {
7 throw;
8 }

因为处理所有的错。 是不可能的= =

那你捕捉他干什么, 要捕捉能遇见的。

关于性能

异常捕捉 肯定会由开销

但是tm能不用吗,可预见错误一定要捕捉,才能尝试恢复,让程序更稳定

而且一般是不会失败的(经常失败就是程序有问题了),所以也没有性能损失

理论上说 你不做大量并发或者一些特别恶心的玩意儿,一丁点的效率损失,真可以忽略 。







posted @ 2011-10-15 20:11  CallMeTommy  阅读(220)  评论(0)    收藏  举报