黑马程序员-异常捕获和处理
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Test(); 6 } 7 public static void Test() 8 { 9 try 10 { 11 int num = 0; 12 num = 10 / num; 13 } 14 catch (Exception) 15 { 16 17 throw; 18 } 19 } 20 }
异常
未处理System.DivideByZeroException
HResult=-2147352558
Message=尝试除以零。
Source=ConsoleApplication1
StackTrace:
在 ConsoleApplication1.Program.Test() 位置 k:\Desktop\TestTemp\ConsoleApplication1\Program.cs:行号 26
在 ConsoleApplication1.Program.Main(String[] args) 位置 k:\Desktop\TestTemp\ConsoleApplication1\Program.cs:行号 12
在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()
InnerException:
这里显示得到 在12行的时候出错。尝试除以零。
1 static void Main(string[] args) 2 { 3 Test(); 4 Console.ReadKey(); 5 } 6 public static void Test() 7 { 8 try 9 { 10 int num = 0; 11 num = 10 / num; 12 } 13 catch (Exception ex) 14 { 15 //打印出异常信息 16 Console.WriteLine( ex.ToString()); 17 } 18 }
显示异常的信息
System.DivideByZeroException: 尝试除以零。
在 ConsoleApplication1.Program.Test() 位置 k:\Desktop\TestTemp\ConsoleApplica
tion1\Program.cs:行号 20
可以看到显示的是20行错误 异常信息是尝试除以零
在这里为什么不提示 11行错误呢?因为这里使用了try-catch 来捕获异常后又抛出了异常信息。 所以就错误中就只留下了throw的错误信息。
如果想要知道具体的异常就需要自定义异常。解决如下。
1 static void Main(string[] args) 2 { 3 Test(); 4 Console.ReadKey(); 5 } 6 public static void Test() 7 { 8 try 9 { 10 int num = 0; 11 num = 10 / num; 12 } 13 catch (Exception ex) 14 { 15 //打印出异常信息 16 throw new Exception("这里异常了", ex); 17 } 18 }
抛出异常信息:
未处理System.Exception
HResult=-2146233088
Message=这里异常了
Source=ConsoleApplication1
StackTrace:
在 ConsoleApplication1.Program.Test() 位置 k:\Desktop\TestTemp\ConsoleApplication1\Program.cs:行号 27
在 ConsoleApplication1.Program.Main(String[] args) 位置 k:\Desktop\TestTemp\ConsoleApplication1\Program.cs:行号 12
在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()
InnerException: System.DivideByZeroException
HResult=-2147352558
Message=尝试除以零。
Source=ConsoleApplication1
StackTrace:
在 ConsoleApplication1.Program.Test() 位置 k:\Desktop\TestTemp\ConsoleApplication1\Program.cs:行号 20
InnerException:
因为这里重新定义了 throw new Exception("这里异常了", ex); 异常。所以就抛出了自己定义的异常信息。message
最近发现如果不需要处理异常 。不用 throw ex。
如下:
1 static void Main(string[] args) 2 { 3 Test(); 4 Console.ReadKey(); 5 } 6 public static void Test() 7 { 8 try 9 { 10 int num = 0; 11 num = 10 / num; 12 } 13 catch (Exception ex) 14 { 15 //打印出异常信息 16 throw ; 17 } 18 }
直接throw即可。
如果不需要异常信息。写法:
1 static void Main(string[] args) 2 { 3 Test(); 4 Console.ReadKey(); 5 } 6 public static void Test() 7 { 8 try 9 { 10 int num = 0; 11 num = 10 / num; 12 } 13 finally 14 { 15 //把占用资源释放掉 16 } 17 }