有时候应用程序会因为程序的最终用户引发的动作或运行代码的环境而发生错误,所以程序都必须能处理可能出现的任何错误。
异常类
在C#中,当出现某个特殊的异常错误条件时,就会创建或抛出一个异常对象,这个对象包含有助于跟踪问题的信息。
所有的异常类都在System名称空间中,除IOException类、CompositionException类和派生于这两个类的类型出外。
IOException类及其派生类在System.IO名称空间中。System.IO处理文件数据的读写
CompositionException类及其派生类在System.ComponentModel.Compostion名称空间中。处理部件和组件的动态加载。
两个重要的类SystemException、ApplicationException。这两个类继承于System.Exception,而System.Exception派生于System.Object类
SystemException类:用于通常由.NET运行库抛出的异常,或由几乎所有的应用程序抛出的异常。
ApplicationException类:自定义应用程序异常类的基类。CLR中抛出的一些机场类也继承于该类。一般建议直接从Exception基类派生自定义异常类
捕获异常
为了在C#代码中处理可能的错误信息,一般把程序分为3中代码块 try-catch-finally。
try:程序正常执行的代码。但是这部分代码可能遇到某些错误。
catch:正常代码出错时执行的处理错误状况的代码。可以用来记录错误。
finally:无论是否出错都会执行的代码。一般包含清理资源的代码。语句块中不能包含return语句。该语句块是可选的 。
执行流程:
程序执行try语句块,如果没有产生异常,正常操作。如果执行中产生异常,中断执行,跳转到catch语句中并开始执行。如果程序中包含finally语句,不管try中是否由异常产出,都会正常执行。
try-catch-finally
可以省略finally语句块
可以有任意多个catch语句块。
可以定义过滤器
System.Exception属性
异常过滤器
C#6中新增的特性。捕获不同的异常类型时,可以选择执行的catch语句块,从而实现针对不同的错误提供不同的处理方式。
static void Main(string[] args) { Stream stream = null; try { //程序代码 Convert.ToInt32(double.MaxValue); } catch (IOException ex) when (ex.Message.Contains("哈哈"))//异常类型是IO异常并且错误提示中含有“哈哈”时执行 { string msg = ex.Message; } catch (IOException ex)//异常类型是IO异常时执行 { throw new Exception("错误信息", ex); //重新抛出异常时改变异常 } catch (Exception ex) when (Filter(ex)) { throw;//重新抛出异常 } catch (Exception ex)//有异常时执行 { throw ex;//重新抛出异常 } finally { stream.Dispose(); } Console.ReadKey(); } static bool Filter(Exception ex) { return false; }