前言
什么是异常?
1:异常时程序运行时的错误,违反了系统约束或者应用程序约束,或出现正在操作时未预料的情况
2:例如:程序尝试除以0或者试图写一个只读文件,程序就会抛出一个异常
3:如果系统没有处理这个异常,系统就会挂起
4: try 语句来指明为避免出现异常而被保护的代码段,并在发生异常时提供代码处理异常
5:try 有三个部分组成 try保护代码段 catch处理异常代码段 finally在所有情况下都要执行的代码,无论异常有没有发生
6: catch 句子有三种形式[一般类型,特定catch子句,带对象的]
7: finally 如果try内没有发生异常,那么在try块的结尾,控制流跳过catch直接执行finally,如果 try内部发生了异常,程序先执行catch再执行finally,即使try块中有return语句,或者在catch中抛出异常,finally也总是会执行
代码示例
异常的产生1:
public static void CatchTest() { int x = 10, y = 0; var z=x / y; Console.WriteLine(z); } 异常: System.DivideByZeroException HResult = 0x80020012 Message = 尝试除以零。
异常的产生2:
public static string Test() { return null; } var res = Test(); res.Trim(); 异常: System.NullReferenceException:“未将对象引用设置到对象的实例。”
try ..catch ..finally
try { 被保护的代码段 } catch (Exception ex) { 异常处理程序 throw ex; } finally { 在所有情况下都要执行的代码,无论异常有没有发生 }
异常处理例子:
int x = 10; try { //被保护的代码段 int y = 0; int z = x / y; } catch (Exception ex) { //异常处理程序 //throw ex; Console.WriteLine("程序产生了异常:" + ex.Message); } finally { Console.WriteLine("在所有情况下都要执行的代码" ); //在所有情况下都要执行的代码,无论异常有没有发生 } 输出: 程序产生了异常:尝试除以零。 在所有情况下都要执行的代码
带参数的catch句子
int x = 10; try { //被保护的代码段 int y = 0; int z = x / y; } catch (Exception ex) { //异常处理程序 //throw ex; //Message: 获取描述当前异常的消息。 //StackTrace:获取调用堆栈上的即时框架字符串表示形式。 //Source: 获取或设置导致错误的应用程序或对象的名称。 Console.WriteLine("程序产生了异常:" + ex.Message); Console.WriteLine("程序产生了异常:" + ex.StackTrace); Console.WriteLine("程序产生了异常:" + ex.Source); } 输出: 程序产生了异常:尝试除以零。 程序产生了异常:在 DDUP.Chtch_20.TryTest() 位置 H:\VisualStudio\DDUP\Chtch_20.cs:行号 33 程序产生了异常:DDUP
finally始终会被执行
try { int x = 10; if (x < 20) { return x; } else { return 20; } } catch (Exception e) { throw e; } finally { Console.WriteLine("this is finally"); } 输出: this is finally
自定义异常:
public static void V4() { try { int x = 10; if (x < 20) { throw new Exception("自定义异常!"); } } catch (Exception e) { Console.WriteLine(e.Message); throw e; } finally { Console.WriteLine("this is finally"); } } 输出: 自定义异常! this is finally
写在最后
在程序中异常处理显得尤为重要,异常处理加上规范的日志记录,会对定位程序中的BUG有很大帮助,每个码农都应该养成良好异常处理习惯和日志记录的习惯;