.net中的Error和Exception在什么场景下出现

在 .NET 里 Error 是“进程级、不可恢复”的致命故障,Exception 是“例行、可捕获、可恢复”的异常事件;
前者你“几乎永远捉不到也救不了”,后者才是我们天天写 try/catch 要处理的东西。
下面把两个词出现的典型场景、捕获可能性、代码示例、面试答法一次列清,背下来即可。

一、Error 典型场景(CLR 发出,你基本只能看着)


错误类型触发点能否 try/catch发生后常见结果
StackOverflowException 无限递归 4.0 之后 默认不能 catch 进程直接被 CLR 枪毙
OutOfMemoryException 2 GB/3 GB 地址空间耗尽 可 catch 但基本恢复不了 同一 AppDomain 很快又挂
ExecutionEngineException CLR 内部损坏 几乎捉不到 运行时自杀
BadImageFormatException 装载 32/64 位不兼容程序集 启动阶段就炸 进程起不来
关键词:“不可恢复”、“由 CLR 产生”、“catch 了也没法继续跑”。

二、Exception 典型场景(日常开发 99 % 都是它)


异常类型触发代码示例能否恢复常用处理
NullReferenceException string s = null; int l = s.Length; 可恢复 判空 / 给默认值
ArgumentException throw new ArgumentException("param invalid"); 可恢复 重新传参
SqlException 连接超时 可恢复 重试 + 熔断
FileNotFoundException 读取配置文件不存在 可恢复 用备用文件
HttpRequestException 调用 REST 返回 503 可恢复 Polly 重试
关键词:“可预期”、“可捕获”、“业务代码自己抛/系统抛”。

三、两段代码一眼看懂区别

 
// 1. Error —— 你 catch 也救不了
static void Main()
{
    try { Recursive(); }          // StackOverflowException
    catch (Exception ex)           // 4.0+ 这里**不会**进来
    { Console.WriteLine(ex); }
}
static void Recursive() => Recursive();
 
// 2. Exception —— 正常捕获恢复
static int SafeDivide(int a, int b)
{
    try { return a / b; }
    catch (DivideByZeroException)   // 例行异常
    { return 0; }                   // 给默认值,程序继续跑
}
 

四、面试标准答法(背下来 30 秒说完)

  1. Error 由 CLR 产生,代表进程级致命故障,如 StackOverflowOutOfMemory
  2. Exception 由框架或业务代码抛出,代表可恢复的例行异常;
  3. Error catch 了也无法继续安全执行,Exception 则可通过 try/catch/finally 处理并恢复流程;
  4. 因此日常开发 99 % 只处理 Exception 体系,Error 仅在日志里记录后让进程崩溃重启。

五、一张速记表


维度ErrorException
来源 CLR/硬件 框架/用户代码
可恢复性
能否 catch 默认不能或无效 可以
示例 StackOverflow NullReference
处理策略 记录+崩溃重启 捕获+重试/降级
posted @ 2025-10-14 10:07  yinghualeihenmei  阅读(9)  评论(0)    收藏  举报