You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分C#中的内置异常与自定义异常?

区分C#中内置异常与自定义异常的几种方法

嘿,这个场景我太熟悉了!不想直接输出ex.Message,又要区分开自己抛的异常和系统内置异常,其实有几个实用的办法,我给你详细说说:

1. 自定义专属异常类(最推荐的规范做法)

直接用Exception类太通用了,不如自己定义一个继承自Exception的专属异常,这样能精准区分。

首先定义你的异常类:

public class NegativeInputException : Exception
{
    // 可以自定义构造方法,也可以直接复用基类的逻辑
    public NegativeInputException(string message) : base(message)
    {
    }
}

然后修改你原来的代码,抛出这个自定义异常:

int a;
try
{
    Console.Write("Input = ");
    a = Convert.ToInt32(Console.ReadLine());
    if (a < 0)
    {
        // 抛出自定义异常
        throw new NegativeInputException("Input Can't < 0");
    }
}
// 优先捕获自定义异常
catch (NegativeInputException ex)
{
    Console.WriteLine("自定义异常提示:输入不能小于0");
}
// 再捕获其他所有内置异常
catch (Exception ex)
{
    Console.WriteLine("内置异常提示:输入格式错误或无效");
}
Console.ReadKey();

这种方式不仅能清晰区分异常类型,代码的可读性和可维护性也更高,是C#异常处理的最佳实践之一。

2. 检查异常的精确类型(快速临时方案)

如果不想额外定义异常类,也可以通过判断异常的精确类型来区分——因为你自己抛出的是直接的Exception实例,而系统内置的异常(比如FormatException、OverflowException)都是Exception的子类。

修改catch块如下:

catch (Exception ex)
{
    // 判断是否是精确的Exception类型(而非它的子类)
    if (ex.GetType() == typeof(Exception))
    {
        Console.WriteLine("自定义异常提示:输入不能小于0");
    }
    else
    {
        Console.WriteLine("内置异常提示:Something error");
    }
}

不过这个方法有个小局限:如果以后代码里其他地方也抛出了new Exception(),就会被误判成这个场景的自定义异常,所以只适合临时快速处理。

3. 用Exception的Data属性标记(灵活但不直观)

还可以在抛异常的时候给Data字典加个自定义标记,用来识别是否是自己抛出的异常:

int a;
try
{
    Console.Write("Input = ");
    a = Convert.ToInt32(Console.ReadLine());
    if (a < 0)
    {
        var customEx = new Exception("Input Can't < 0");
        // 添加自定义标记
        customEx.Data["IsCustom"] = true;
        throw customEx;
    }
}
catch (Exception ex)
{
    if (ex.Data.Contains("IsCustom") && (bool)ex.Data["IsCustom"])
    {
        Console.WriteLine("自定义异常提示:输入不能小于0");
    }
    else
    {
        Console.WriteLine("内置异常提示:Something error");
    }
}
Console.ReadKey();

这种方式比较灵活,但不如自定义异常类直观,团队协作时可能需要额外说明标记的含义。

总的来说,最推荐第一种方法,既能明确区分异常类型,也符合代码规范,后续扩展也更方便。

内容的提问来源于stack exchange,提问作者Liudi Wijaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:22:10