跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 异常传播
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#异常传播 = '''异常传播'''是C#异常处理机制的核心概念之一,指当代码中抛出异常时,运行时系统会沿着调用堆栈向上查找能够处理该异常的catch块的过程。理解异常传播的规则对于编写健壮的程序至关重要。 == 基本概念 == 在C#中,异常传播遵循以下原则: 1. 当异常被抛出(通过{{code|throw}}关键字或运行时自动抛出)时,程序会立即终止当前代码块的执行。 2. 运行时系统从当前方法开始,沿着调用堆栈逐层向上搜索匹配的{{code|catch}}块。 3. 如果找到匹配的{{code|catch}}块,则执行该块中的代码;如果未找到,程序将终止并显示未处理的异常信息。 === 传播路径示例 === 以下代码演示异常传播的基本流程: <syntaxhighlight lang="csharp"> using System; class Program { static void MethodA() { Console.WriteLine("MethodA开始执行"); throw new InvalidOperationException("测试异常"); } static void MethodB() { Console.WriteLine("MethodB开始执行"); MethodA(); } static void Main() { try { MethodB(); } catch (InvalidOperationException ex) { Console.WriteLine($"捕获异常: {ex.Message}"); } } } </syntaxhighlight> '''输出:''' <pre> MethodB开始执行 MethodA开始执行 捕获异常: 测试异常 </pre> '''解释:''' 1. {{code|MethodA}}抛出异常后,运行时检查其内部是否有匹配的{{code|catch}}块(此处无)。 2. 异常传播到调用者{{code|MethodB}},同样未找到处理逻辑。 3. 最终异常到达{{code|Main}}方法中的{{code|try-catch}}块,被成功捕获。 == 传播规则详解 == === 调用堆栈分析 === 异常传播的路径可以通过调用堆栈(Call Stack)可视化。以下Mermaid图展示上述示例的传播路径: <mermaid> graph TD Main -->|调用| MethodB MethodB -->|调用| MethodA MethodA -->|抛出异常| ExceptionHandler[Main中的catch块] </mermaid> === 未处理异常 === 如果异常未被任何{{code|catch}}块捕获,程序会终止并显示错误信息。例如: <syntaxhighlight lang="csharp"> static void Main() { MethodB(); // 无try-catch块 } </syntaxhighlight> '''输出:''' <pre> 未处理的异常: System.InvalidOperationException: 测试异常 </pre> == 高级主题 == === 异常过滤器 === C# 6.0引入的异常过滤器(Exception Filters)允许在{{code|catch}}块中附加条件: <syntaxhighlight lang="csharp"> try { MethodB(); } catch (InvalidOperationException ex) when (ex.Message.Contains("测试")) { Console.WriteLine("条件捕获成功"); } </syntaxhighlight> === 重新抛出异常 === 使用{{code|throw}}关键字重新抛出异常时,原始堆栈信息会被保留: <syntaxhighlight lang="csharp"> try { MethodB(); } catch (Exception) { Console.WriteLine("记录错误后重新抛出"); throw; // 保留原始堆栈 } </syntaxhighlight> == 实际应用场景 == === 分层架构中的异常处理 === 在多层应用程序(如Web服务)中,异常通常从数据访问层传播到业务逻辑层,最终由UI层处理: <mermaid> graph LR DAL[数据访问层] -->|抛出SQL异常| BLL[业务逻辑层] BLL -->|包装为自定义异常| UI[用户界面层] UI -->|显示友好错误| User </mermaid> === 日志记录中间件 === 在ASP.NET Core中,中间件可以全局捕获异常并记录日志: <syntaxhighlight lang="csharp"> app.Use(async (context, next) => { try { await next(); } catch (Exception ex) { logger.LogError(ex, "全局异常捕获"); throw; } }); </syntaxhighlight> == 数学表示 == 异常传播的路径可以形式化表示为: <math> \text{传播路径} = \begin{cases} \text{当前方法} \rightarrow \text{调用者}_1 \rightarrow \cdots \rightarrow \text{调用者}_n & \text{直到找到catch块} \\ \text{程序终止} & \text{若未找到} \end{cases} </math> == 总结 == * 异常传播是自底向上搜索处理逻辑的过程。 * 使用{{code|throw}}重新抛出异常时需注意堆栈信息的保留。 * 在实际项目中,应规划清晰的异常处理层次结构。 通过理解异常传播机制,开发者可以更有效地调试代码并设计鲁棒的错误处理策略。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 异常处理]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Code
(
编辑
)