所谓自定义异常是指我们继承c#中的异常类,如果希望用户能以编程方式区分一些错误条件,您可以创建自己的用户定义的异常。.NET Framework 提供根本上从基类 Exception 派生的异常类的层次结构。这些类中的每一个都定义一个特定的异常,因此在很多情况下只需捕捉该异常。您也可以通过从 Exception 类派生来创建自己的异常类。
创建自己的异常时,好的编码做法是以“Exception”这个词作为用户定义的异常类名的结尾。
小提示:关于类和构造函数的知识请参看下一章,而对于本节的内容,您也可以在下一章学完后再回头来学习。 |
下面我们做一个实例,从定义自定义异常一直到捕获和处理:
1. 创建名为“自定义异常”的Windows桌面应用程序项目;
2. 在解决方案资源管理器中的项目名称上点击右键,添加一名为“MydefineException.cs”的类。
3. 整个类的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace自定义异常 { //在这句前面加上修饰符public,并使该类继承自Exception public class MydefineException : Exception { private string message;// 用作错误消息的私有变量
//添加两个构造函数 public MydefineException() { message = "我高兴说你错误,你就错误!"; //为变量message赋值 } public MydefineException(string msg) : base(msg)//参考本书后面章节的构造函数重载 { message = msg; //将传入参数msg的值赋给变量message } ///<summary> ///重写异常错误信息 ///</summary> ///<returns>错误消息</returns> public override string ToString() { return message; } } }
|
4. 在项目中添加名为“UserException.cs”的Windows窗体;在界面上还是一个TextBox一个Button就行了。
5. 双击Button,在事件编写代码,如下:
private void button1_Click(object sender, EventArgs e) { try { string txt = textBox1.Text; if (txt == "") {// 如果为空的话,就提示我们自定义的错误 throw new MydefineException("我说你错,你就错了"); //因为MydefineException类有两个构造函数,所以可以再试试下面这种 //throw new MydefineException(); } int i = int.Parse(txt); button1.Text = "转换结果为: " + i.ToString(); } catch (MydefineException mex) { MessageBox.Show(mex.Message); } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
6. 运行以看结果。
老田:好了,关于异常处理再最后说一点。只有在哪些可能出错,而代码又无法明确干涉的地方才用异常。前面讲到,因为异常本身还是比较耗费系统效率的。但凡可以预知并处理的错误,还是不要滥用try…catch…finally。
本章小结
本章学习了异常处理的基本的方法——try-catch-finally。
使用一个 Try/Catch 块可以向代码段添加异常处理。使用一个try,我们可以使用多个catch语句来执行。.NET 运行时可以依次处理 catch 块,它将使用找到的第一个匹配块。因此在使用的时候,我们要将子类的catch块放在程序的前端。您可以嵌套 Try 块,以便轻松而有效地推入和弹出异常处理状态。在 Try 块后添加一个 Finally 块,这样无论发生什么,都可以无条件运行代码。
在本章,您学习到:
1. 异常是程序运行中发生的错误。系统异常派生出两大类:
· 一种是系统内建的异常,这些都是系统定义的异常,被称为系统程序异常。
· 一种是用户自己定义的异常,被称为应用程序异常。
2. 异常的产生是通过throwing一个该异常的对象实现的,异常的捕获是通过catch该异常的对象。
3. 可以使用多个catch来捕获异常
4. 异常处理的流程
5. 关键字
· try
· catch
· throwing
· finally
· return
6. 用户自定义异常
异常及其处理具有以下特点:
· 在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常。
· 在可能引发异常的语句周围使用 try 块。
· try 块中发生异常后,控制流会立即跳转到关联的异常处理程序(如果存在)。
· 如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误消息。
· 如果 catch 块定义了一个异常变量,则可以使用它来获取有关所发生异常的类型的更多信息。
· 可能导致异常的操作通过 try 关键字来执行。
· 异常处理程序是在异常发生时执行的代码块。在 C# 中,catch 关键字用于定义异常处理程序。
· 程序可以使用 throw 关键字显式地引发异常。
· 异常对象包含有关错误的详细信息,比如调用堆栈的状态以及有关错误的文本说明。
· 即使引发了异常,finally 块中的代码也会执行,从而使程序可以释放资源。
问题:
1. 说出五条以上你认为最重要的提高代码可读性的规范来。
2. VS中是否可以打N个断点,如果可以,那么打N个断点有什么用?
3. VS中遇到断点后直接按F5键有什么后果?
4. 是否可以一次清除所有断点?那个菜单的那个项?
5. try…catch…是否可以嵌套?如果可以请做出示例。
6. 在catch语句块中,是否可以用比如goto等跳转关键字替换return?
7. 如果在catch语句块中执行了return,请问Finally语句块中的代码还能够得到执行吗?
8. 你认为try…catch…语句最主要应该用在哪些地方?
本文章为天轰穿原创文章,转载请注明出处及作者。