.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 秒说完)
-
Error 由 CLR 产生,代表进程级致命故障,如
StackOverflow、OutOfMemory; -
Exception 由框架或业务代码抛出,代表可恢复的例行异常;
-
Error catch 了也无法继续安全执行,Exception 则可通过
try/catch/finally处理并恢复流程; -
因此日常开发 99 % 只处理 Exception 体系,Error 仅在日志里记录后让进程崩溃重启。
五、一张速记表
| 维度 | Error | Exception |
|---|---|---|
| 来源 | CLR/硬件 | 框架/用户代码 |
| 可恢复性 | ❌ | ✅ |
| 能否 catch | 默认不能或无效 | 可以 |
| 示例 | StackOverflow | NullReference |
| 处理策略 | 记录+崩溃重启 | 捕获+重试/降级 |
浙公网安备 33010602011771号