keywords: 异常处理, C#异常, try-catch-finally, 自定义异常, 抛出异常
description: 本章详细介绍了 C#中的异常处理机制,包括异常的类型、try-catch-finally 语句的使用、如何抛出异常以及如何定义自定义异常。通过图文结合的方式帮助读者深刻理解异常处理的原理和应用。


异常处理是编程中至关重要的一部分,它帮助我们在程序运行过程中应对未预料到的错误。本章将深入探讨 C#中的异常处理机制,包括异常的类型、try-catch-finally 语句的使用、如何抛出异常以及如何定义自定义异常。

什么是异常

在程序运行过程中,可能会遇到各种各样的错误,例如除数为零、数组越界、文件未找到等。这些错误在 C#中被称为”异常”。异常是程序执行过程中出现的问题或意外情况,通常由系统自动检测并生成相应的异常对象。

异常的类型

C#中有多种类型的异常,以下是几种常见的异常类型:

  1. System.Exception: 所有异常的基类。
  2. System.SystemException: 由系统引发的异常。
  3. System.ApplicationException: 由应用程序引发的异常。
  4. 常见的派生异常:
    • System.NullReferenceException: 尝试访问未实例化的对象。
    • System.IndexOutOfRangeException: 数组下标超出范围。
    • System.DivideByZeroException: 除数为零。

try-catch-finally

C#使用try-catch-finally语句来处理异常。try块包含可能引发异常的代码,catch块用于捕获异常并处理,而finally块包含无论是否发生异常都要执行的代码。以下是其基本结构:

  1. try {
  2. // 可能引发异常的代码
  3. } catch (Exception ex) {
  4. // 处理异常的代码
  5. } finally {
  6. // 始终执行的代码
  7. }

示例

  1. try {
  2. int[] numbers = { 1, 2, 3 };
  3. Console.WriteLine(numbers[5]);
  4. } catch (IndexOutOfRangeException ex) {
  5. Console.WriteLine("数组下标超出范围:" + ex.Message);
  6. } finally {
  7. Console.WriteLine("无论是否发生异常,这段代码都会执行。");
  8. }
  1. graph TD
  2. A[try] --> B[可能抛出异常的代码]
  3. A --> C[catch]
  4. C --> D[处理异常]
  5. A --> E[finally]
  6. E --> F[总是执行的代码]

在上述示例中,try块中的代码尝试访问数组的一个不存在的元素,从而引发IndexOutOfRangeException异常。catch块捕获并处理该异常,最后finally块确保某些代码始终执行。

抛出异常

有时,我们需要在代码中手动抛出异常,使用throw关键字可以实现这一点。

示例

  1. public void CheckAge(int age) {
  2. if (age < 18) {
  3. throw new ArgumentException("年龄不能小于18岁");
  4. }
  5. Console.WriteLine("年龄符合要求");
  6. }

在该示例中,CheckAge方法检查传入的年龄是否小于 18 岁,如果是,则抛出ArgumentException异常。

自定义异常

在某些情况下,标准异常类型不能准确描述问题,这时可以定义自定义异常。

示例

  1. public class InvalidAgeException : Exception {
  2. public InvalidAgeException(string message) : base(message) { }
  3. }
  1. public void CheckAge(int age) {
  2. if (age < 18) {
  3. throw new InvalidAgeException("年龄不能小于18岁");
  4. }
  5. Console.WriteLine("年龄符合要求");
  6. }

在该示例中,定义了一个名为InvalidAgeException的自定义异常类,并在CheckAge方法中使用该异常。

通过本章的学习,您应该已经掌握了 C#中的异常处理机制,包括如何使用try-catch-finally语句、如何手动抛出异常以及如何定义自定义异常。异常处理对于编写健壮和稳定的代码至关重要,希望您能够深入理解并熟练应用。