结构化异常

2016-12-29 19:33:27来源:cnblogs.com作者:老乌尼人点击

第七城市

只要是软件,它就有可能存在一些问题,即使它看起来能正常的工作。
造成软件异常的原因很多,如用户的非法输入,程序算法错误造成的内存溢出,通信网络故障,程序的配置文件被破坏、删除...

.Net的异常处理

.Net平台提供了一种标准技术(结构化异常处理[SEH])来发和捕获运行时错误;结构化异常处理的优点在于,统一了开发人员对.NET领域内各语言都通用的方式来处理错误,并且提供了准确的问题描述和触发异常时调用栈的详细信息,此外还提供了问题处理的帮助链接。

System.Excption基类

System.Excption类的核心成员

捕获异常

当调用一个可能引发异常的方法时,应当用try/catch块;一旦捕获到异常对象,通过异常对象就可以知道异常的相关信息。然后可以将异常的相关信息保存到日志文件中,或者数据库,或者通过邮件的方式发送到你的邮箱。
try代码块中执行的是可能发生异常的代码,一旦发生异常,执行流就会直接进入到catch块代码中。如果没有发生异常,代码会直接忽略catch块中的代码。

  try  {      File.ReadAllText("some.txt");  }  catch (Exception ex)  {      Console.WriteLine($"{ex.TargetSite}-{ex.Message}-{ex.StackTrace}-{ex.HelpLink}");  }

在VS中编写代码的时候,我们可以将鼠标悬停在方法之上,这样智能提示就能显示出这个方法有可能触发的异常类型
在try代码块中,有可能会发生多种类型的异常,我们可以通过多个catch块分别去处理相应的异常。一般我们需要将要捕获的特定异常放在前面,最后才是Exception类型

  try  {      File.ReadAllText("exce.txt");  }  catch (ArgumentException e) { }  catch (IOException e) { }  catch (Exception e) { }

自定义异常类型

.NET基类库定义了许多派生自System.Exception的类,如ArgumentException、StackOverflowException等等
.NET平台引发的异常被称为系统异常,这些异常是被认为不可修复的。系统异常都被派生自System.SystemException类型。定义系i同异常的目的是为了区分触发异常的是.NET运行库还是正在执行的应用程序代码。

  //其他代码...  catch (StackOverflowException ex)  {      Console.WriteLine(ex is SystemException);//通过is关键字判断是否是SystemException类型  }

正如上面所说,如果我们自定义异常类型,就应该派生自System.ApplicationException类型。

 //一个标准的自定义异常类型应该继承自ApplicationException或者Exception类型,并添加Serializable [Serializable] public class MyException : ApplicationException {     public MyException()     {     }     public MyException(string message) : base(message)     {     }     public MyException(string message, Exception innerException) : base(message, innerException)     {     }     protected MyException(SerializationInfo info, StreamingContext context) : base(info, context)     {     }     //可以选择重写父类异常的属性     public override string Message     {         get         {             return "这是一个MyException类型异常";         }     } }

finally

finally代码块表示try/catch之后必须要执行的一段代码。它不是在处理异常中必要的,一般用来处理资源释放。

 StreamReader reader = null; try {     reader = new StreamReader(""); } catch (Exception e) { } finally {     reader.Close(); }

捕获全局异常

 Application.ThreadException += Application_ThreadException; Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

Application.ThreadException 事件

结语

通过异常处理,我们可以使程序更加稳定,不至于程序莫宁奇妙的就挂掉


第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台