C#异常处理
C# 中的异常处理基于四个关键字构建,分别是 try、catch、finally 和 throw。
- try:try 语句块中通常用来存放容易出现异常的代码,其后面紧跟一个或多个 catch 语句块;
- catch:catch 语句块用来捕获 try 语句块中的出现的异常;
- finally:finally 语句块用于执行特定的语句,不管异常是否被抛出都会执行;
- throw:throw 用来抛出一个异常。
try/catch语句
假设一段代码引发了异常,则可以使用 try 和 catch 组合来捕获这个异常,其语法格式如下所示:
try{
// 引起异常的语句
}catch( ExceptionName e1 ){
// 错误处理代码
}catch( ExceptionName e2 ){
// 错误处理代码
}
...
catch( ExceptionName eN ){
// 错误处理代码
}finally{
// 要执行的语句
}
【示例】使用 try/catch 语句捕获程序中的异常:
using System;
namespace c.biancheng.net
{
class Demo
{
static void Main(string[] args)
{
try{
int a = 123;
int b = 0;
int x = a / b;
}catch (Exception e) {
Console.WriteLine("捕获到的异常:{0}", e);
}finally{
Console.WriteLine("finally 语句块中的代码");
}
Console.WriteLine("程序中的其它代码");
}
}
}
运行结果如下:
捕获到的异常:System.DivideByZeroException: 尝试除以零。
在 c.biancheng.net.Demo.Main(String[] args)
finally 语句块中的代码
程序中的其它代码
C#中的异常类
C# 中的异常类主要是从 System.Exception 类派生的,比如 System.ApplicationException 和 System.SystemException 两个异常类就是从 System.Exception 类派生的。- System.ApplicationException 类支持由程序产生的异常,因此我们自定义的异常都应继承此类;
- System.SystemException 类是所有系统预定义异常的基类。
下表中列举了一些从 Sytem.SystemException 类派生的预定义异常类:
| 异常类 | 描述 |
|---|---|
| System.IO.IOException | 处理 I/O 错误 |
| System.IndexOutOfRangeException | 处理当方法引用超出范围的数组索引时产生的错误 |
| System.ArrayTypeMismatchException | 处理当数组类型不匹配时产生的错误 |
| System.NullReferenceException | 处理引用一个空对象时产生的错误 |
| System.DivideByZeroException | 处理当除以零时产生的错误 |
| System.InvalidCastException | 处理在类型转换期间产生的错误 |
| System.OutOfMemoryException | 处理空闲内存不足产生的错误 |
| System.StackOverflowException | 处理栈溢出产生的错误 |
自定义异常类
除了可以使用系统预定义的异常类外,我们还可以自行定义异常类,自定义的异常类都应继承 System.ApplicationException 类。下面通过示例来演示一下自定义异常类的使用:
using System;
namespace c.biancheng.net
{
class Demo
{
static void Main(string[] args)
{
TestUserDefinedException test = new TestUserDefinedException();
try{
test.validate(12);
}catch(InvalidAgeException e){
Console.WriteLine("InvalidAgeException: {0}", e);
}
Console.WriteLine("其它代码");
}
}
}
public class InvalidAgeException : ApplicationException
{
public InvalidAgeException (string message): base(message)
{
}
}
public class TestUserDefinedException
{
public void validate(int age)
{
if(age < 18)
{
throw (new InvalidAgeException("Sorry, Age must be greater than 18"));
}
}
}
运行结果如下:
InvalidAgeException: InvalidAgeException: Sorry, Age must be greater than 18
在 TestUserDefinedException.validate(Int32 age)
在 c.biancheng.net.Demo.Main(String[] args)
其它代码
抛出异常
如果异常是直接或间接派生自 System.Exception 类,则可以在 catch 语句块中使用 throw 语句抛出该异常,所谓抛出异常这里可以理解为重新引发该异常。throw 语句的语法格式如下所示:
catch(Exception e) {
...
Throw e
}
ICP备案:
公安联网备案: