首页
学习
活动
专区
圈层
工具
发布

c#和捕获异常

C# 异常处理全面解析

基础概念

在 C# 中,异常是指在程序执行期间发生的意外或异常情况,它会中断正常的程序流程。异常处理是 C# 提供的一种机制,用于优雅地处理这些运行时错误,而不是让程序崩溃。

异常处理机制

C# 使用 try-catch-finally 块来处理异常:

代码语言:txt
复制
try
{
    // 可能抛出异常的代码
}
catch (SpecificException ex)
{
    // 处理特定类型的异常
}
catch (Exception ex)
{
    // 处理所有其他异常
}
finally
{
    // 无论是否发生异常都会执行的代码
}

异常类型

C# 中的异常都继承自 System.Exception 类,主要分为两类:

  1. 系统异常:由 .NET 运行时抛出的异常
    • NullReferenceException - 尝试访问 null 对象的成员
    • IndexOutOfRangeException - 数组索引越界
    • DivideByZeroException - 除以零
    • InvalidCastException - 无效的类型转换
    • ArgumentException - 无效的参数
  • 自定义异常:开发者可以创建自己的异常类

异常处理优势

  1. 程序健壮性:防止程序因未处理的异常而崩溃
  2. 错误隔离:将错误处理代码与业务逻辑分离
  3. 信息丰富:异常对象包含详细的错误信息
  4. 调试友好:异常堆栈跟踪有助于定位问题

应用场景

  1. 文件 I/O 操作(文件不存在、权限不足等)
  2. 数据库操作(连接失败、查询错误等)
  3. 网络通信(连接超时、数据格式错误等)
  4. 用户输入验证(格式不正确、范围越界等)
  5. 资源管理(内存不足、资源泄漏等)

常见问题与解决方案

问题1:捕获异常但不处理

错误示例

代码语言:txt
复制
try
{
    // 代码
}
catch (Exception ex)
{
    // 空catch块或仅记录日志
}

解决方案

  • 至少记录异常信息
  • 考虑是否应该重新抛出异常
  • 或者提供有意义的用户反馈

问题2:捕获过于宽泛的异常

错误示例

代码语言:txt
复制
try
{
    // 代码
}
catch (Exception ex) // 捕获所有异常
{
    // 处理
}

解决方案

  • 尽可能捕获特定的异常类型
  • 对不同类型的异常采取不同的处理方式

问题3:异常屏蔽

错误示例

代码语言:txt
复制
try
{
    // 代码1
    try
    {
        // 代码2
    }
    catch (Exception ex)
    {
        // 处理但不重新抛出
    }
}
catch (Exception ex)
{
    // 外层catch无法捕获内层已处理的异常
}

解决方案

  • 谨慎使用嵌套的try-catch
  • 需要时使用 throw 重新抛出异常

最佳实践

  1. 特定异常优先:先捕获最具体的异常,最后捕获基类异常
  2. 避免空的catch块:至少要记录异常信息
  3. 合理使用finally:释放资源、清理操作放在finally中
  4. 自定义异常:为特定业务场景创建自定义异常
  5. 异常信息丰富:抛出异常时提供有意义的错误信息
  6. 不要滥用异常:不要用异常处理正常的控制流

自定义异常示例

代码语言:txt
复制
public class InsufficientFundsException : Exception
{
    public decimal CurrentBalance { get; }
    public decimal RequiredAmount { get; }
    
    public InsufficientFundsException(decimal currentBalance, decimal requiredAmount)
        : base($"Insufficient funds. Current balance: {currentBalance}, required: {requiredAmount}")
    {
        CurrentBalance = currentBalance;
        RequiredAmount = requiredAmount;
    }
}

// 使用
try
{
    if (balance < amount)
    {
        throw new InsufficientFundsException(balance, amount);
    }
}
catch (InsufficientFundsException ex)
{
    Console.WriteLine(ex.Message);
    // 处理资金不足的情况
}

通过合理使用异常处理机制,可以显著提高 C# 应用程序的可靠性和用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# 异常捕获

本文内容:C# 异常捕获 ---- C# 异常捕获 1.编译错误与运行错误 2.进行异常捕获 ---- 1.编译错误与运行错误 在编写程序时,编译器会帮我们检查程序是否有错误,当我们改正之后,程序就可以编译了...---- 2.进行异常捕获 在程序运行时出现错误是很可怕的事,它们被称为bug,造成的影响有大有小,但是几乎都是恶性的。...而我们要说的异常捕获,就是为了在异常发生时执行解决办法。...异常捕获语句的语法格式如下: try { 异常的代码> } catch { 异常后执行的代码> } finally { 异常都要执行的代码(可选)> } catch...还可以写成catch(Exception e),其中e为捕获到的异常,我们可以通过e了解到异常的具体信息。

1.6K10
  • Unity手游崩溃异常如何捕获--C#及JVM捕获

    1 C#脚本异常捕获 C#脚本未捕获的异常,与Android和Native未捕获异常很大的区别是,未捕获异常不会照成引用的闪退。所以,C#脚本的异常危害相对较小,但是同样更加容易存在在游戏中。...C#脚本异常,抛出的时机不同,危害性也有所不同; 在Start、Awake等函数抛出的异常,会造成Update、OnGUI无法正常运行,游戏可能表现为无响应、图片确实等。...Update、OnGUI的异常也一定会引起游戏逻辑及画面上的一些异常。 从测试角度,C#脚本未捕获的异常时一定需要报告给开发者的。...这样就能顺利的输出,未捕获的异常信息了。...2 Java未捕获异常 Android在Thread中提供了setUncaughtExceptionHandler和setDefaultUncaughtExceptionHandler,setUncaughtExceptionHandler

    4.7K40

    【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )

    一、Python 默认捕获所有类型异常 1、默认捕获所有类型异常 - 无法获取异常类型 使用 try-except 语句 , 不指定异常类型 , 默认就可以捕获所有类型的异常 ; 语法如下 : try:...可能出现异常的代码块 except: 出现异常后执行的代码块 这种情况下 , 可以捕获异常 , 但是无法获取异常类型 ; 2、代码实例 - 默认捕获所有类型异常 代码实例 : """ 异常处理操作...出现异常, 进行异常处理, 异常内容 Process finished with exit code 0 二、Python 捕获所有类型异常 - 捕获 Exception 异常 1、捕获 Exception..., 然后使用 except 块来捕获所有类型的异常 ; 在 except 块中 , 可以指定要捕获的异常类型 , 或者使用 Exception 来捕获所有类型的异常 ; 使用 try-except 语句..., 可以捕获异常 , 但是无法获取异常类型 ; 2、代码实例 - 捕获 Exception 异常 代码实例 : """ 异常处理操作 代码示例 """ try: num = 1 / 0

    3.2K30

    【C++】异常处理 ② ( 异常捕获类型 | 异常捕获机制 - 严格匹配异常类型 | 未知异常捕获 - 不知道异常类型 )

    一、异常捕获机制 - 严格匹配异常类型 1、异常捕获机制 - 严格匹配异常类型 异常机制 与 函数机制 是 互不干涉的两个系统 , 函数参数 的 匹配机制 是 形参 与 实参 进行匹配 , 异常捕获 的...匹配机制 是 基于 抛出的异常类型进行匹配 ; 注意 区分 异常捕获 与 函数参数匹配 , 异常捕获 匹配的是 抛出的异常类型 与 catch 分支中要捕获的异常类型 ; 异常捕获 , 严格按照类型进行匹配...二、异常捕获机制 - 未知异常捕获 1、未知异常捕获 - 不知道异常类型 上面的案例中 , 抛出了 char 类型的异常 ‘A’ , 在 catch 分支中拦截的是 int 类型的异常 , 也就是 没有拦截到...使用 throw 关键字 抛出了一个 char 类型的异常 ; catch (int e) 代码块中 , 可以捕获 int 类型异常 , 不能捕获 char 类型的异常 ; 由于 catch 代码块 中没有明确捕获...(int e) { cout 捕获到异常 : " << e << endl; } // 捕获一切未知类型的异常 catch ( ... ) { cout 捕获到未知类型异常

    73910

    SpringBoot——全局异常捕获和自定义异常

    这样在使用来说很不友好,因此我们需要一个全局异常的捕获,进行一个格式化的输出,或者也可以预先定义我们自己的异常。以此实现对异常的优雅处理。...(我此处只展示前后端分离的情况,返回json数据) 二、自定义异常 介绍: 自定义异常需要继承Exception或者RuntimeException,然后在异常处理器中进行执行异常的处理。...**介绍:**此处需要一个全局异常的捕获处理,同时可以加入指定异常的自定义处理。...{ private Logger log = LoggerFactory.getLogger(CustomExceptionHandler.class); /** * 捕获全局异常...e.getMessage(), ReturnMsg.EXCEPTION1.getCode(),ReturnMsg.EXCEPTION1.getMsg()); } /** * 捕获自定义异常

    1.5K20

    【异常捕获处理】

    在Java中,可以使用多级别的异常捕获来处理不同类型的异常。多级别异常捕获的原则是从具体的异常类型到一般的异常类型进行捕获处理,以确保程序能够捕获并处理所有可能出现的异常情况。...下面是一个简单的案例分析和代码实现: 假设有一个方法 divideNumbers,用于计算两个数的商,并且可能会抛出ArithmeticException和NumberFormatException异常...我们可以使用多级别的异常捕获来处理这两种异常情况。...首先捕获了ArithmeticException和NumberFormatException异常,然后再捕获一般的Exception异常,以确保程序能够捕获并处理所有可能的异常情况。...在 main 方法中,我们分别调用 divideNumbers 方法传入不同的参数,来测试多级别异常捕获的效果。 这样的设计可以让程序更加健壮,能够更好地处理各种异常情况,提高程序的容错性和稳定性。

    8810

    鸿蒙开发:实现全局异常捕获和异常查看

    收费是一方面,如何灵活的拿到错误信息后,执行我们想要的逻辑,也是自研的一个诉求,比如全局监听到异常后,重启应用,或者上传到自己的服务器,或者可以在应用内查看等等,实现一个全局异常捕获,确实有很多的有用之处...异常监听功能介绍: 接口名称 说明 onUnhandledException(errMsg: string): void 系统回调接口,应用注册后,当应用产生未捕获的异常时的回调。...onException'); } }) 当有异常信息发生时,就会走以上的监听,需要注意,注册后可以捕获到应用产生的js crash,应用崩溃时进程不会退出。...本文主要内容如下: 1、封装之后的catch库效果 2、catch库快速引入 3、catch库主要实现 一、封装之后的catch库效果 目前除了提供了全局异常捕获方法之外,还提供了异常查看UI,方便测试人员或者其他人员遇到异常之后...三、catch库主要实现 其实catch库仅仅针对系统的全局异常做了一层封装,实现了本地异常信息的存储,实现文件形式存储和本地数据库形式存储,其它的暂无拓展。

    34710

    python抛出异常和捕获异常_python自定义异常

    主动抛异常 1. 抛异常 有时,程序需要主动抛出异常,因为某些情况下,你需要反馈消息给更上层的调用者,告诉它有一些异常情况发生,而你抛出异常的地方,没有能力处理它,因此需要向上抛出异常。...这种情况为什么不让系统自己抛出异常呢?...一个原因是上层的调用者本身就希望能够捕获有别于系统异常的自定义异常,二来,有些情况下,程序的逻辑是没有异常的,但是,从业务角度考虑,的确是一个不寻常的情况,因此需要我们主动抛出异常。...‘__main__’: divide(10, 5) divide(10, 0) 抛出异常时,你可以指定抛出哪个异常,如果你不想指定,那么可以抛出异常Exception, 它是所有异常的父类 def divide...自定义异常类 在程序里引入自定义的异常类,可以让代码更具可读性,同时对异常的划分更加精细,那么在处理异常时也就更加具有针对性,自定义异常继承自Exception,或者那些类本身就继承自Exception

    1.2K20

    C++:异常的捕获和处理

    try    : try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch 块。 如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。...3.1 异常的抛出和匹配规则 1....如果一直到main函数都没有捕获到异常(catch捕获的类型和抛出异常的类型匹配不上),那么程序就会被强制终止 double Division(int len, int time) { if (time...) { cout << "未知错误" << endl; } return 0; }  5、实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配,可以抛出的派生类对象, 使用基类捕获,这个在实际中非常实用...3、C++中异常经常会导致资源泄漏的问题,比如在new和delete中抛出了异常,导致内存泄 漏,在lock和unlock之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题。

    54400

    使用Python捕获和处理异常日志

    前言 在程序的开发以及测试中,异常处理是至关重要的一环。当我们的程序运行时发生错误或异常,及时捕获并记录异常日志可以帮助我们快速定位和解决问题,提升程序的稳定性和可靠性。...本文将介绍如何使用Python来捕获和处理异常日志,帮助读者更好地理解和应用异常处理的技术。...还有,在执行int(a)/int(b)的时候,如果输入的不是数字而是字母也会产生异常。 异常处理 当程序出现异常的时候,我们需要捕获它并且处理它,否则程序会停止执行。...程序执行到try语句里的语块,会自动捕获异常,如果出现异常,会立即中断try语句块的执行,转到except语句块。...通过Python的异常处理机制,我们可以捕获和处理程序运行过程中的异常情况,并记录相关的日志信息,帮助定位和解决问题。希望本文可以帮到大家!

    35710
    领券