# C# 异常处理(Exception)
异常是在程序执行期间出现的问题。异常处理是对特殊情况的一种响应,比如尝试除以零。
异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。
C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。
- try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch () 块。
- catch ():程序通过异常处理程序捕获异常。在 () 中输入需要捕获的异常的类型。
- finally:finally 代码块中的语句不管是否抛出异常都会执行。
- throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。
# 语法
try | |
{ | |
// 可能引起异常的语句 | |
} | |
catch(ExceptionName e1) | |
{ | |
// 错误处理代码 | |
} | |
catch(ExceptionName e2) | |
{ | |
// 错误处理代码 | |
} | |
catch(ExceptionName eN) | |
{ | |
// 错误处理代码 | |
} | |
finally | |
{ | |
// 一定会执行的语句 | |
} | |
// 抛出异常 | |
throw new ExceptionName(); |
# C# 中的异常类
C# 中的异常类主要是直接或间接地派生于 System.Exception 类
System.ApplicationException 和 System.SystemException 类是派生于 System.Exception 类的异常类。
System.ApplicationException 类支持由应用程序生成的异常。
System.SystemException 类是所有预定义的系统异常的基类。
常用的预定义系统异常
异常类 | 描述 |
---|---|
System.IO.IOException | 处理 I/O 错误 |
System.IndexOutOfRangeException | 处理当方法指向超出范围的数组索引时生成的错误 |
System.ArrayTypeMismatchException | 处理当数组类型不匹配时生成的错误 |
System.NullReferenceException | 处理当依从一个空对象时生成的错误 |
System.DivideByZeroException | 处理当除以零时生成的错误 |
System.InvalidCastException | 处理在类型转换期间生成的错误 |
System.OutOfMemoryException | 处理空闲内存不足生成的错误 |
System.StackOverflowException | 处理栈溢出生成的错误 |
# 异常处理
# 预定义系统异常
例子
private static void Main() | |
{ | |
int a = 0; | |
try | |
{ | |
Console.WriteLine(1 / a); | |
} | |
catch (System.DivideByZeroException e) | |
{ | |
Console.WriteLine(e); | |
} | |
catch (System.Exception e) | |
{ | |
Console.WriteLine(e); | |
} | |
finally | |
{ | |
Console.WriteLine("finally"); | |
} | |
throw new System.Exception("Test System.Exception"); | |
} |
运行结果
System.DivideByZeroException: Attempted to divide by zero. | |
at... | |
finally | |
Unhandled exception. System.Exception: Test System.Exception | |
at... |
# 自定义异常类
- 需要继承 System.Exception
自定义异常类
namespace Exception | |
{ | |
public class CustomizeException : System.Exception | |
{ | |
private int notAllowed; | |
public int NotAllowed { get => notAllowed; } | |
public CustomizeException() : base() { } | |
public CustomizeException(int value) : base(string.Format("This value is not allowed: {0}", value)) | |
{ | |
notAllowed = value; | |
} | |
public CustomizeException(int value, string message) : base(message) | |
{ | |
notAllowed = value; | |
} | |
public CustomizeException(int value, string message, System.Exception exception) : base(message, exception) | |
{ | |
notAllowed = value; | |
} | |
} | |
} |
引发异常
private static void Main() | |
{ | |
int a = 1; | |
try | |
{ | |
throw new CustomizeException(a); | |
} | |
catch (CustomizeException ce) | |
{ | |
Console.WriteLine(ce); | |
} | |
Console.WriteLine("\n"); | |
try | |
{ | |
throw new CustomizeException(a, "111111", new System.Exception("222222")); | |
} | |
catch (CustomizeException ce) | |
{ | |
Console.WriteLine(ce); | |
} | |
Console.WriteLine("\n"); | |
if (a == 1) | |
{ | |
throw new CustomizeException(a); | |
} | |
} |
运行结果
Exception.CustomizeException: This value is not allowed: 1 | |
at... | |
Exception.CustomizeException: 111111 | |
---> System.Exception: 222222 | |
--- End of inner exception stack trace --- | |
at... | |
Unhandled exception. Exception.CustomizeException: This value is not allowed: 1 | |
at... |