跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 异常处理策略
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#异常处理策略 = 异常处理是C#编程中确保程序健壮性和可靠性的核心机制。本指南将系统讲解C#异常处理的最佳实践,涵盖基础概念到高级策略,并提供实际应用案例。 == 1. 异常处理基础 == '''异常(Exception)'''是程序运行时发生的意外情况,可能由以下原因导致: * 无效的用户输入 * 文件/网络资源不可用 * 内存不足 * 编程逻辑错误 C#使用'''try-catch-finally'''结构处理异常: <syntaxhighlight lang="csharp"> try { // 可能抛出异常的代码 int.Parse("abc"); // 格式错误 } catch (FormatException ex) { Console.WriteLine($"输入格式错误: {ex.Message}"); } finally { Console.WriteLine("清理资源执行区"); } </syntaxhighlight> 输出: <pre> 输入格式错误: Input string was not in a correct format. 清理资源执行区 </pre> == 2. 异常类型层次 == <mermaid> classDiagram class Object class Exception { +string Message +string StackTrace +Exception InnerException } Object <|-- Exception Exception <|-- SystemException Exception <|-- ApplicationException SystemException <|-- ArgumentException SystemException <|-- NullReferenceException SystemException <|-- IndexOutOfRangeException </mermaid> 关键异常类型: * '''System.Exception''':所有异常的基类 * '''System.SystemException''':CLR抛出的系统级异常 * '''System.ApplicationException''':用户自定义异常的基类(不推荐继承) == 3. 最佳实践策略 == === 3.1 精确捕获异常 === 避免捕获基类Exception,应捕获具体异常类型: <syntaxhighlight lang="csharp"> // 不推荐 try { /* 代码 */ } catch (Exception ex) { /* 处理所有异常 */ } // 推荐做法 try { File.ReadAllText("missing.txt"); } catch (FileNotFoundException ex) { Console.WriteLine("文件未找到,请检查路径"); } catch (IOException ex) { Console.WriteLine("IO错误: " + ex.Message); } </syntaxhighlight> === 3.2 异常筛选器(C# 6+) === 使用when关键字添加条件判断: <syntaxhighlight lang="csharp"> try { ConnectToDatabase(); } catch (SqlException ex) when (ex.Number == 1205) { // 处理死锁特定错误 RetryOperation(); } catch (SqlException ex) { LogError(ex); throw; // 重新抛出 } </syntaxhighlight> === 3.3 资源清理模式 === 使用'''using'''语句自动释放IDisposable资源: <syntaxhighlight lang="csharp"> using (var stream = new FileStream("data.txt", FileMode.Open)) { // 使用stream对象 } // 自动调用Dispose() </syntaxhighlight> 等效于: <syntaxhighlight lang="csharp"> FileStream stream = null; try { stream = new FileStream("data.txt", FileMode.Open); // 使用stream } finally { stream?.Dispose(); } </syntaxhighlight> == 4. 自定义异常 == 创建自定义异常应继承自Exception类: <syntaxhighlight lang="csharp"> public class InventoryException : Exception { public int ItemId { get; } public InventoryException(int itemId, string message) : base(message) => ItemId = itemId; } // 使用示例 try { if (stockCount <= 0) throw new InventoryException(123, "库存不足"); } catch (InventoryException ex) { Console.WriteLine($"商品{ex.ItemId}异常: {ex.Message}"); } </syntaxhighlight> == 5. 性能考量 == 异常处理开销较大,应避免: * 使用异常控制正常流程 * 在频繁调用的代码中捕获异常 优化方案: <syntaxhighlight lang="csharp"> // 使用Try模式替代异常 if (int.TryParse(input, out var number)) { // 成功处理 } else { // 处理无效输入 } </syntaxhighlight> == 6. 实际案例:Web API异常处理 == ASP.NET Core中的全局异常处理: <syntaxhighlight lang="csharp"> // 自定义异常中间件 public class ExceptionMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { try { await next(context); } catch (ValidationException ex) { context.Response.StatusCode = 400; await context.Response.WriteAsJsonAsync(new { Error = "验证失败", Details = ex.Errors }); } catch (Exception ex) { // 记录日志 Log.Error(ex, "全局异常"); context.Response.StatusCode = 500; await context.Response.WriteAsJsonAsync(new { Error = "系统错误", RequestId = context.TraceIdentifier }); } } } </syntaxhighlight> == 7. 异常处理数学建模 == 异常处理概率模型: <math> P(\text{系统稳定}) = 1 - \sum_{i=1}^{n} P(\text{异常}_i) \times (1 - P(\text{处理成功}_i)) </math> 其中: * <math>P(\text{异常}_i)</math>:第i类异常发生概率 * <math>P(\text{处理成功}_i)</math>:对该异常的成功处理概率 == 总结 == {| class="wikitable" |+ 异常处理策略对照表 ! 场景 !! 推荐做法 !! 避免做法 |- | 资源管理 | using语句/Dispose模式 | 依赖finalizer |- | 预期错误 | Try模式(如TryParse) | 使用异常控制流程 |- | 不可恢复错误 | 记录日志后终止 | 静默吞没异常 |- | 跨层传递 | 包装自定义异常 | 暴露底层异常细节 |} 遵循这些策略可显著提高代码的健壮性和可维护性。记住:异常处理的目标不是消除所有异常,而是确保程序在异常情况下能优雅降级或安全终止。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 最佳实践]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)