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,我们可以确保程序在遇到错误时能够采取适当的措施,提高应用程序的健壮性和用户体验。

相关推荐
大空大地20261 天前
C#高级语法总结
开发语言·c#
数据法师1 天前
微软官方外挂 PowerToys 深度解析:从架构设计到0.99新特性,重构你的Windows生产力
windows·microsoft·重构
周杰伦fans1 天前
C# AutoCAD 二次开发极简入门:从环境搭建到高效实战
开发语言·c#
xiaoxiang96091 天前
AI时代的技术趋势:为什么软件正在回归CLI?
人工智能·microsoft
.NET修仙日记1 天前
.NET EFCore批量插入性能优化实战:30秒 → 0.5秒
性能优化·c#·.net·.netcore·微软技术·efcore·踩坑实录
Esofar1 天前
Dddify:给 ASP.NET Core 项目一套轻量、清晰、可落地的 DDD 基础设施
c#·ddd·asp.net core·cqrs·dddify·clean architecture
搬砖的梦先生1 天前
Codex Prompt 中“目标 + 约束”写法详解与操作指南
人工智能·microsoft·prompt
至善迎风1 天前
Windows 10/11 如何退出微软账户并改用本地账户登录(含找不到选项的解决方法)
windows·microsoft
Coder_Shenshen1 天前
【基于LibUA库的OPC UA服务器与客户端Demo——协议解析与Bug修复实践】
网络·c#·bug
信必诺2 天前
C# —— VS2022配置终端程序跨平台发布方法(部署Ubuntu22.04举例,详细多图)
ubuntu·c#·跨平台部署