c#的异常

什么是异常

在C#中,异常是程序运行时发生的意外错误或异常情况的表示。它是一种机制,用于在程序执行过程中处理错误,而不是让程序直接崩溃。

根据知识库[3]中的定义:

"在C#中,程序中的运行时错误通过使用一种称为'异常'的机制在程序中传播。异常由遇到错误的代码引发,由能够更正错误的代码捕捉。异常可由.NET运行时或由程序中的代码引发。异常由从Exception派生的类表示。每个类标识异常的类型,并包含详细描述异常的属性。"

异常的关键特性

  1. 异常是对象 :所有异常都派生自System.Exception
  2. 异常传播:当错误发生时,异常被"抛出",控制流会跳转到最近的异常处理块
  3. 异常类型 :不同的异常类型表示不同类型的错误(如DivideByZeroExceptionNullReferenceException等)
  4. 异常信息:异常对象包含关于错误的详细信息,如错误消息和调用堆栈

异常处理的机制

C#使用trycatchfinally关键字来处理异常:

1. 基本结构

cs 复制代码
try
{
    // 可能引发异常的代码
}
catch (特定异常类型 ex)
{
    // 处理异常的代码
}
finally
{
    // 无论是否发生异常都会执行的代码
}

2. 异常处理示例

cs 复制代码
public class ExceptionTest 
{
    static double SafeDivision(double x, double y) 
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    } 

    public static void Main() 
    {
        double a = 98, b = 0;
        double result;

        try 
        {
            result = SafeDivision(a, b);
            Console.WriteLine($"{a} divided by {b} = {result}");
        } 
        catch (DivideByZeroException) 
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

3. 多个catch块

cs 复制代码
try 
{
    // 可能引发异常的代码
} 
catch (ArgumentException e) 
{
    Console.WriteLine($"Processing failed: {e.Message}");
} 
catch (OperationCanceledException) 
{
    Console.WriteLine("Processing is cancelled.");
}

4. 异常筛选器

cs 复制代码
try 
{
    // 可能引发异常的代码
} 
catch (Exception e) when (e is ArgumentException || e is DivideByZeroException) 
{
    Console.WriteLine("Processing failed with specific exception types.");
}

为什么需要异常处理

根据知识库[6]:

"异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code 所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。"

异常处理的好处:

  • 提高代码的健壮性和可靠性
  • 将错误处理逻辑与正常业务逻辑分离
  • 使代码更清晰、更易维护
  • 允许在错误发生时采取适当的恢复措施

异常处理的最佳实践

  1. 仅捕获你知道如何处理的异常 :不要捕获System.Exception而不重新引发它
  2. 优先捕获最具体的异常类型:先捕获派生类,再捕获基类
  3. 使用finally清理资源:确保资源(如文件、数据库连接)被正确释放
  4. 不要使用异常处理来控制程序流程:异常应该用于处理真正的异常情况,而不是常规的控制流

异常的创建

可以使用throw关键字手动创建异常:

cs 复制代码
throw new DivideByZeroException("除数不能为零");

在C# 6.0及以上版本,还可以使用表达式形式:

cs 复制代码
public string Name { 
    get => name; 
    set => name = value ?? 
        throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null"); 
}

异常处理的流程

  1. 当try块中的代码引发异常时
  2. CLR(公共语言运行时)会检查调用堆栈
  3. 查找第一个匹配的catch块
  4. 执行匹配的catch块中的代码
  5. 如果没有匹配的catch块,程序将终止并显示错误消息
  6. 无论是否发生异常,finally块中的代码都会执行

总结

异常是C#中处理运行时错误的重要机制,它使程序能够优雅地处理意外情况,而不是直接崩溃。通过使用trycatchfinally,我们可以确保程序在遇到错误时能够采取适当的措施,提高应用程序的健壮性和用户体验。

相关推荐
河西石头4 小时前
powerconfig告别繁琐配置读写---为C#提供了一个快捷的读写配置文件的API
开发语言·c#·高效读写配置文件·c#配置文件·xml读写
Scout-leaf5 小时前
WPF新手村教程(五)— 附魔教学(绑定)
c#·wpf
宝桥南山5 小时前
Microsoft Fabric - 试一下在Blazor应用中使用 GraphQL API去连接Lakehouse
microsoft·c#·asp.net·.netcore·fabric·db
gc_22996 小时前
C#调用Microsoft.ML.OnnxRuntime和YOLO5模型时的输入数据格式分析
yolo·c#·数据预处理
猹叉叉(学习版)6 小时前
【ASP.NET CORE】 11. SignalR
笔记·后端·c#·asp.net·.netcore
bugcome_com6 小时前
C# 匿名方法与 Lambda 表达式全解析
c#
橘颂TA7 小时前
Qt数据展示与选择控件,高效实现数据交互
microsoft
格林威7 小时前
工业相机图像高速存储(C#版):直接IO(Direct I/O)绕过系统缓存,附堡盟相机实战代码!
开发语言·人工智能·数码相机·计算机视觉·缓存·c#·视觉检测