C# --- 异常处理(Exception Handling)

异常处理是确保程序在运行过程中能够正确处理和恢复错误状态的重要机制。C# 使用 try, catch, finally 关键字来捕获和处理异常,从而提高程序的健壮性和稳定性。

1 什么是异常处理?

想象一下,你在家里做饭。突然间,煤气用完了,或者食材不够了,这些都是意外情况。你需要一种方法来处理这些意外情况,比如拨打煤气公司电话或者去超市买食材。异常处理在编程中就像处理这些意外情况的机制,它帮助你应对程序运行过程中可能出现的问题,而不是让程序崩溃。

2 异常处理的基本概念

  • 异常:是程序在运行过程中发生的错误或意外情况,比如除零错误、文件未找到等。
  • 捕获异常:使用 try 块来包裹可能发生异常的代码,当异常发生时,程序会跳转到 catch 块中执行预定的处理逻辑。
  • 处理异常:在 catch 块中,你可以处理异常,比如记录错误信息、提示用户或者进行恢复操作。
  • 确保执行的代码:使用 finally 块,无论是否发生异常,都会执行其中的代码,通常用于释放资源。

3 基本语法

> try 块:包含可能引发异常的代码。

> catch 块:用于捕获和处理异常。

> finally 块:无论是否发生异常,都会执行的代码块,通常用于释放资源。

4 示例:基本异常处理

cs 复制代码
using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            int a = 10;
            int b = 0;
            int result = a / b;

            Console.WriteLine($"Result: {result}");
        }
        catch (DivideByZeroException ex)
        {
            Console.WriteLine($"Exception caught: {ex.Message}");
        }

        finally
        {
            Console.WriteLine("Finally block executed.");
        }
    }
}

>>输出

Exception caught: Attempted to divide by zero.

Finally block executed.

5 自定义异常

可以定义自己的异常类型,以便更好地表示特定的错误情况。

cs 复制代码
using System;

class InvalidAgeException : Exception
{
    public InvalidAgeException(string message) : base(message) { }
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            int age = -5;
            if (age < 0)
            {
                throw new InvalidAgeException("Age cannot be negative.");
            }
        }

        catch (InvalidAgeException ex)
        {
            Console.WriteLine($"Custom exception caught: {ex.Message}");
        }

    }

}

>>输出

Custom exception caught: Age cannot be negative.

6 异常过滤器(Exception Filters)

C# 6 引入了异常过滤器,可以在 catch 块中使用 when 关键字来进一步筛选异常。

cs 复制代码
using System;

class Program
{
    static void Main(string[] args)
    {
        int b = 0;
        try
        {
            int a = 10;
            int result = a / b;
            Console.WriteLine($"Result: {result}");
        }

        catch (DivideByZeroException ex) when (b == 0)
        {
            Console.WriteLine("Divide by zero with b equal to zero.");
        }
    }
}

>>输出

Divide by zero with b equal to zero

为什么需要异常处理?

  • 提高程序稳定性:通过捕获和处理异常,程序不会因为意外情况而崩溃。
  • 提高用户体验:你可以友好地提示用户发生了什么问题,而不是让程序直接退出。
  • 方便调试和维护:通过记录异常信息,开发人员可以更容易地发现和修复问题。

想象一下

想象你在家做饭时,煤气突然用完了。如果没有处理措施,你的饭就做不成了(程序崩溃)。但如果你提前准备了备用煤气罐(异常处理),你可以继续做饭,只是稍微耽搁一下(程序继续运行,并且用户得到一个友好的提示)。此外,你还可以记录下来下次什么时候需要换煤气(日志记录)。

相关推荐
小白学大数据7 分钟前
绕过拼多多 App 反抓包机制的综合逆向解决方案
开发语言·爬虫·python·自动化
使者大牙8 分钟前
【单点知识】 Python装饰器介绍
开发语言·数据库·python
带土110 分钟前
2. C++ private、protected、public
开发语言·c++
我不是8神13 分钟前
字节跳动 Eino 框架(Golang+AI)知识点全面总结
开发语言·人工智能·golang
古城小栈15 分钟前
Rust复合类型 四大军阀:数、元、切、串
开发语言·后端·rust
kong790692826 分钟前
Python核心语法-Python自定义模块、Python包
开发语言·python·python核心语法
爱敲代码的小鱼1 小时前
事务核心概念与隔离级别解析
java·开发语言·数据库
小冷coding1 小时前
【Java】遇到微服务接口报错导致系统部分挂掉时,需要快速响应并恢复,应该怎么做呢?如果支付服务出现异常如何快速处理呢?
java·开发语言·微服务
星火开发设计1 小时前
二维数组:矩阵存储与多维数组的内存布局
开发语言·c++·人工智能·算法·矩阵·函数·知识
夜勤月2 小时前
彻底终结内存泄漏与悬挂指针:深度实战 C++ 智能指针底层原理与自定义内存池,打造稳如泰山的系统基石
开发语言·c++