如何区分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
相关产品推荐
相关产品推荐

