C#异常处理
C#的异常是指在程序运行时出现的特殊情况。异常处理则是对出现异常情况的的处理方式,把程序当前的控制权从某个部分转移到另一个部分方式。
C#异常处理需要注意如下四个关键字
try,catch,finally,throw
-
try
try块标识了一个将被激活的特定异常的代码块,其后跟一个或多个catch块 -
catch
程序通过异常处理来捕获异常,catch中指定了要捕获的异常 -
finally
finally块是对于不管异常是否会被抛出都会执行的语句,比如在做数据库处理时不管在处理中是否异常都要最终关闭掉打开的数据库连接 -
throw
当出现问题时可以用throw来抛出一个异常 -
语法结构
try
{
//引起异常的语句内容
}
catch(ExceptionName1 e1)
{
//捕获到ExceptionName1异常后需要进行的处理代码
}
catch(ExceptionName2 e2)
{
//捕获到ExceptionName2异常后需要进行的处理代码
}
finally
{
//必须要执行的代码
}
-
C#中的异常类
C#中异常类的根类是:System.Exception
从上面这个根类派生出来两个
System.ApplicationException
System.SystemException -
System.ApplicationException类
支持由应用程序生成的异常,程序员在定义自己的异常的时候都应从这个类派生出新的异常类 -
System.SystemExcepiton类
这个类是所有预定义的系统异常的基类
从System.SystemException类派生出来的类有 -
System.IO.IOExcepiton
处理I/O错误的异常类 -
System.IndexOutOfRangeException
处理当方法指向超出范围的数组索引时产生的异常 -
System.ArrayTypeMismatchException
处理当数组类型不匹配时生成的错误 -
System.NullReferenceException
处理当引用一个空对象进行操作时的异常 -
System.DivideByZeroException
处理当除以零时产生的异常 -
System.InvalidCastException
处理当类型转换时产生的异常 -
System.OutOfMemoryException
处理当内存空间不足时产生的异常 -
System.StackOverflowException
处理栈溢出时产生的异常 -
C#中的异常处理方式
C#使用try和catch块的形式提供了一种结构化的异常处理方案,这样的话可以把核心程序语句与错误处理语句分开处理。
使用Visual Studio新建C#控制台应用程序chapter19_001
新增类Div
class Div
{
int result;
public Div()
{
result = 0;
}
public void division(int num1, int num2, out int result)
{
result = num1 / num2;
}
}
在Main方法中添加如下测试代码
int result = 0;
Div d = new Div();
try
{
d.division(20, 0, out result);
}
catch (DivideByZeroException e1)
{
Console.WriteLine("error:" + e1.Message);
}
finally
{
Console.WriteLine("运行结束");
Console.WriteLine("result = {0}", result);
}
Console.ReadKey();
编译运行结果如下:
- 创建用户自定义异常
用户自定义自己的异常类,是派生自ApplicationException类。
新增自定义异常类NotNumberException
class NotNumberException : ApplicationException
{
public NotNumberException(string message) : base(message)
{
}
}
Main方法中添加如下测试自定义异常的代码:
//测试自定义异常
Console.WriteLine("---------------测试自定义异常---------------");
Regex reg = new Regex("[0-9]{1,}");
Console.WriteLine("请输入一个数字:");
string num = Console.ReadLine();
try
{
while (true)
{
if (reg.IsMatch(num))
{
Console.WriteLine("输入的是一个数字,数字为:{0}", num);
Console.WriteLine("请输入一个数字:");
num = Console.ReadLine();
}
else
{
throw new NotNumberException("输入的不是一个数字");
}
}
}
catch (NotNumberException e)
{
Console.WriteLine("error:" + e.Message);
}
编译运行的结果如下:
- 异常对象抛出
如果异常是直接或者间接派生自System.Exception类,可以抛出一个对象,在catch语句中可以抛出当前对象。
catch(Exception e)
{
//捕获异常后的处理代码
throw e; //抛出当前异常对象
}