二十 异常和状态管理
异常
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能不用吗,可预见错误一定要捕捉,才能尝试恢复,让程序更稳定
而且一般是不会失败的(经常失败就是程序有问题了),所以也没有性能损失
理论上说 你不做大量并发或者一些特别恶心的玩意儿,一丁点的效率损失,真可以忽略 。

浙公网安备 33010602011771号