网站首页 > 技术文章 正文
A. 核心概念
- 异常(Exception)
- - 是运行时发生的错误状况,用来中断正常流程并传递错误信息。
- - .NET 中所有异常都继承自 System.Exception。
- try–catch–finally 结构
- - try:放置可能抛出异常的代码;
- - catch:捕获指定类型的异常并处理;可以有多个 catch,按从子类到父类顺序;
- - finally:无论是否发生异常,都会执行,用于清理资源。
- throw 与 rethrow
- - throw ex 会重置堆栈,丢失原始抛出点;
- - throw 而不带变量可保留原始堆栈信息。
- 自定义异常
- - 继承自 Exception 或 ApplicationException;
- - 实现常见构造函数(无参、带消息、带消息+内部异常);
- - 用于表示领域专用错误。
- 异常最佳实践
- - 只捕获你能处理的异常,不要滥用 catch(Exception);
- - 不用异常做正常逻辑分支;
- - 在 finally / using 中释放非托管资源;
- - 对公共 API 可抛出自定义类型,便于调用方区分;
- - 日志要记录关键信息(异常类型、消息、堆栈)。
B. 代码示例
using System;
using System.IO;
public class ExceptionDemo
{
// 自定义异常
public class BusinessException : ApplicationException
{
public BusinessException(string message) : base(message) { }
public BusinessException(string message, Exception inner) : base(message, inner) { }
}
public void ProcessFile(string path)
{
try
{
// 可能抛出 FileNotFoundException、UnauthorizedAccessException 等
string content = File.ReadAllText(path);
Console.WriteLine("文件内容长度:" + content.Length);
// 业务校验
if (content.Length == 0)
{
throw new BusinessException("文件内容为空,无法处理。");
}
}
catch (BusinessException bex)
{
// 专门处理业务异常
Console.WriteLine("业务错误:" + bex.Message);
}
catch (FileNotFoundException fnf)
{
Console.WriteLine(#34;文件未找到:{fnf.FileName}");
// 可以选择重新抛出或记录日志
throw;
}
catch (Exception ex)
{
// 通用异常处理
Console.WriteLine("发生未知错误:" + ex.Message);
// 重新抛出,保留堆栈
throw;
}
finally
{
Console.WriteLine("无论是否出错,都会执行的清理逻辑。");
}
}
public void DemoUsing(string path)
{
// using 自动调用 Dispose,内部也使用 try–finally
try
{
using (var reader = new StreamReader(path))
{
Console.WriteLine(reader.ReadToEnd());
}
}
catch
{
Console.WriteLine("读取文件时发生错误。");
}
}
}
C. 自测题
- 写出 try、catch、finally 的执行顺序;如果 try 中有 return,finally 会不会执行?
- 区分 throw ex; 与 throw; 的区别,并说明在什么场景下使用后者更合适。
- 设计一个自定义异常 DataValidationException,包含字段 FieldName(出错字段名),并在多个构造函数中初始化它。
- 为什么不推荐在每个方法内部都写 catch(Exception)?请列出至少两条理由。
- 当需要对多个资源(如文件流、数据库连接)进行清理时,除了 using,还可以怎么做?请简要描述。
猜你喜欢
- 2025-09-01 Python定时任务,三步实现自动化_python定时任务,三步实现自动化
- 2025-09-01 (三)Java基础知识复习(异常处理)_java异常处理规则(新手必看)
- 2025-09-01 情人节脱单秘诀,程序员表白的情话大盘点!| CSDN 博文精选
- 2025-09-01 这几道面试题,可以考考自己_面试考什么题
- 2025-09-01 教程3 猜数字游戏_猜数字游戏玩法
- 2025-09-01 Go 学习:那些不一样的知识点(下)_不一样的知识的英文
- 2025-09-01 execute和submit的区别_execute和implement的区别
- 2025-09-01 愤怒的TryCatch_愤怒的英文
- 2025-09-01 catch at和catch up with的区别是什么
- 2025-09-01 优秀程序员需要掌握的代码整洁之道
- 最近发表
-
- C语言重要吗?_c语言重要吗计算机专业
- 2024 年顶级 C# 面试问题和答案_c#面试题及答案2020
- C#调用C++编写的DLL需要通过P/Invoke机制实现
- 掌握 C# 和 .NET:常用术语与概念_c#.net教程
- C++ .NET与C# .NET:谁才是.NET开发的“真香”选择?
- 是C++好,带GC的Java、C#好?还是Rust好?
- 为什么有人一直喜欢 C 而不喜欢 C++?
- Python定时任务,三步实现自动化_python定时任务,三步实现自动化
- (三)Java基础知识复习(异常处理)_java异常处理规则(新手必看)
- 情人节脱单秘诀,程序员表白的情话大盘点!| CSDN 博文精选
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)