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{
//
}
如上所示,您可以列出多个catch语句块来捕获不同类型的异常,并防止try语句块在不同情况下产生多个异常。
[示例] 使用 try/catch 语句捕获程序中的异常。
using System;
namespace it-kiso.com
{
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("程序中的其它代码");
}
}
} C# 异常类
C# 中的异常类主要派生自 System.Exception 类。例如,两个异常类 System.ApplicationException 和 System.SystemException 都派生自 System.Exception 类。
- 自定义异常必须从 System.ApplicationException 类继承,因为它支持以编程方式生成的异常。
- System.SystemException 类是所有系统预定义异常的基类。
下表列出了从 Sytem.SystemException 类派生的一些预定义异常类。
| 异常类 | 解释 |
|---|---|
| 系统.IO.IOException | 处理 I/O 错误 |
| 系统索引超出范围异常 | 处理方法引用超出范围的数组索引时生成的错误。 |
| System.ArrayTypeMismatchException | 处理数组类型不匹配时的错误 |
| 系统.NullReferenceException | 处理引用空对象时的错误。 |
| 系统.DivideByZeroException | 除以零时处理错误 |
| System.InvalidCastException | 处理类型转换期间产生的错误 |
| 系统内存不足异常 | 处理由于可用内存不足而导致的错误 |
| 系统堆栈溢出异常 | 处理堆栈溢出错误 |
自定义异常类
除了使用系统预定义的异常类之外,您还可以定义自己的异常类。自定义异常类必须继承自 System.ApplicationException 类。以下示例演示了自定义异常类的使用。
using System;
namespace it-kiso.com
{
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("申し訳ありませんが、年齢は18歳以上でなければなりません"));
}
}
} 操作的结果将是:
InvalidAgeException: InvalidAgeException: 申し訳ありませんが、年齢は18歳以上でなければなりません
TestUserDefinedException.validate(Int32 age)
it-kiso.com.Demo.Main(String[] args)

如果异常直接或间接派生自 System.Exception 类,则可以在 catch 语句块中使用 throw 语句来引发异常。这里所谓的抛出异常可以理解为重新抛出异常。 throw语句的语法是:
catch(Exception e) {
…
Throw e
}




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

