【C#】try-catch-finally语句的执行顺序,以及在发生异常时的执行顺序
try-catch-finally语句
执行顺序
-
执行
try块:程序首先尝试执行try块中的代码。如果在此期间没有发生异常,则跳过catch块,直接执行finally块(如果存在)。 -
发生异常时的处理:
- 如果在
try块中发生了异常,并且有匹配的catch块可以处理该异常,那么程序会立即跳转到对应的catch块。 catch块会处理异常,即执行异常处理逻辑。- 在
catch块执行完毕后,无论是否抛出了新的异常或重新抛出原始异常,都会接着执行finally块(如果有)。 - 如果在
catch块中抛出了异常(无论是新异常还是通过throw;重新抛出原始异常),这个异常会在finally块执行之后继续向上层传播。
- 如果在
-
执行
finally块:不论是否发生异常,也不论异常是否被处理,finally块中的代码总是会在try和所有catch块执行完毕后被执行。这是确保资源清理和状态恢复的重要机制。 -
后续执行:
finally块执行完成后,程序会根据是否有未捕获的异常来决定接下来的行为。如果没有未捕获的异常,程序将继续正常执行;如果有未捕获的异常,异常将向上传播给调用栈中的上一级方法,直到找到合适的异常处理器或者程序终止。
特殊情况
- 如果
finally块中有return语句、throw语句、goto语句等控制转移语句,这可能会改变正常的执行流程,但一般不推荐这样做,因为这会使代码行为变得复杂和难以预测。 - 如果
try或catch块中有return语句,finally块仍然会在返回值计算完毕但尚未返回给调用者之前执行。 - 强制退出应用程序(如调用
Environment.Exit())、线程被中止、计算机断电等情况会导致finally块可能不会被执行。
注意点
在 catch 块中使用 throw 语句重新抛出异常或抛出一个新的异常时,finally 块仍然会在异常传播之前执行。这是编程语言(如 Java 和 C#)的正常行为,确保了资源可以被正确清理。
执行顺序如下:
- 首先尝试执行
try块中的代码。 - 如果
try块中发生了异常,并且有匹配的catch块,则执行该catch块。 - 在
catch块执行完毕后,不论是否在其中抛出了新的异常,都会执行finally块。 - 最后,如果在
catch中抛出了异常,这个异常会继续向上层传播。
因此,在 catch 块中抛出异常不会阻止 finally 块的执行;finally 块总是会在控制流离开 try-catch 结构之前被执行。
需要注意的是,finally 块中的代码应该尽量避免再次抛出未捕获的异常,因为这可能会掩盖原始异常。此外,如果 finally 块中有返回语句或抛出异常,它可能会影响从 try 或 catch 块中已经发生的返回或抛出操作。在大多数情况下,应该避免这种情况,以保持代码的行为可预测。
代码示例
展示了 try-catch-finally 的使用以及在发生异常时的执行顺序:
using System;class Program
{static void Main(){Console.WriteLine("程序开始");try{Console.WriteLine("尝试执行可能引发异常的代码...");// 模拟一个异常throw new InvalidOperationException("这是一个测试异常。");}catch (InvalidOperationException ex){Console.WriteLine($"捕获到异常: {ex.Message}");// 在这里处理特定类型的异常// 重新抛出异常throw;}finally{Console.WriteLine("无论是否发生异常,都会执行这个finally块。");}Console.WriteLine("程序结束");}
}
输出结果将会是:
程序开始
尝试执行可能引发异常的代码...
捕获到异常: 这是一个测试异常。
无论是否发生异常,都会执行这个finally块。
未处理的异常:System.InvalidOperationException: 这是一个测试异常。在 Program.Main() ...
请注意,最后一行 "程序结束" 不会打印出来,因为异常没有被最终处理(在 catch 中通过 throw; 重新抛出了),并且该异常导致了程序终止。然而,finally 块中的语句仍然被执行了。
这个例子说明了即使发生了异常并且在 catch 块中再次抛出,finally 块也会按照预期执行。这确保了任何必要的清理代码都能运行,比如关闭文件或网络连接等操作。
相关文章:
【C#】try-catch-finally语句的执行顺序,以及在发生异常时的执行顺序
try-catch-finally语句 执行顺序 执行 try 块:程序首先尝试执行 try 块中的代码。如果在此期间没有发生异常,则跳过 catch 块,直接执行 finally 块(如果存在)。 发生异常时的处理: 如果在 try 块中发生了…...
【vue】vite + ts +vue3 安装pinia
vue3 TS 安装使用pinia状态管理_vue3 ts pinia-CSDN博客...
PointPillars:数据预处理
在 PointPillars 算法中,将点云划分为点柱(Pillars)是核心步骤之一,用于将稀疏点云数据转换为规则的张量表示,方便后续 2D 卷积操作。以下是点云划分为点柱的具体方法和实现步骤: 1. 点云划分为网格 将 3D…...
node.js的异步工作之---回调函数与回调地狱
回调函数:在 Node.js 中,很多 API 都是异步的,通常通过回调函数来处理操作完成后的结果。这种回调模式虽然非常高效,但会导致代码逐渐变得难以维护,尤其是当有多个异步操作嵌套时(即回调地狱)。…...
Mac Android studio 升级LadyBug 版本,所产生的bug
当Build 出现,这样的文字以后: Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.3.3. Cannot sync the project. We recommend upgrading to Gradle version 8.9. The minimum compatible Gradle version is 8.5. …...
stm32 hex文件烧写
STM32的HEX文件烧写是将编译后的程序代码(以HEX格式存储)下载到STM32单片机中的过程。以下是对STM32 HEX文件烧写的详细解释: 一、HEX文件简介 HEX文件,即Intel HEX文件,是一种由文本行组成的ASCII文件,每…...
【编译原理】编译原理知识点汇总·属性文法和语法制导翻译
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀编译原理_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...
【unity c#】深入理解string,以及不同方式构造类与反射的性能测试(基于BenchmarkDotNet)
出这篇文章的主要一个原因就是ai回答的性能差异和实际测试完全不同,比如说是先获取构造函数再构造比Activator.CreateInstance(type)快,实际却相反 对测试结果的评价基于5.0,因为找不到unity6确切使用的net版本,根据c#9推测是net5…...
VSCode 插件开发实战(八):创建和管理任务 Task
前言 VSCode 的扩展能力使得开发者能够根据个人需求定制工作环境,自定义插件和任务管理是 VSCode 强大功能的一部分,通过这些功能,开发者可以自动化常见工作流,简化日常开发任务,提高整体开发效率。本文将详细介绍如何…...
在 Node.js 中正确处理 `async/await` 及数组迭代
在使用 Node.js 开发应用程序时,我们常常需要处理异步操作。例如,当我们从数据库获取数据、调用外部API或执行文件读取时,这些操作都可能需要一些时间才能完成。在这种情况下,我们通常会使用 async/await 语法来简化异步编程的复杂…...
本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——13使用Resnet-Bin
本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——13使用Resnet-Bin 根据前面的内容,目前已经可以获取到resnet的bin模型 1 .Resnet的bin测试 这里给大家一个测试视频里面黑线的demo,大家可以用来测试自己的黑线识别精度 …...
FFmpeg第三话:FFmpeg 视频解码详解
FFmpeg 探索之旅 一、FFmpeg 简介与环境搭建 二、FFmpeg 主要结构体剖析 三、FFmpeg 视频解码详解 FFmpeg第三话:FFmpeg 视频解码详解 FFmpeg 探索之旅前言一、视频解码基础二、FFmpeg 关键 API 深度剖析(一)avformat_open_input()ÿ…...
解决 vue3 中 echarts图表在el-dialog中显示问题
原因: 第一次点开不显示图表,第二次点开虽然显示图表,但是图表挤在一起,页面检查发现宽高只有100px,但是明明已经设置样式宽高100% 这可能是由于 el-dialog 还没有完全渲染完成,而你的 echarts 组件已经开始尝试渲染图…...
C++ OpenGL学习笔记(4、绘制贴图纹理)
相关链接: C OpenGL学习笔记(1、Hello World空窗口程序) C OpenGL学习笔记(2、绘制橙色三角形绘制、绿色随时间变化的三角形绘制) C OpenGL学习笔记(3、绘制彩色三角形、绘制彩色矩形) 通过前面…...
关于我的Java考试被老师挂掉的这件事......
目录 1.事情起源 2.问题出现 3.最后的考试结果 4.问题如何解决的 5.此件事情引发我的思考 1.事情起源 现在是2024-12-25中午的13:08分,我于今天上虞结束了这个学期的Java课程的学习,上午的课程内容就是开始,使用MVC实现对于题目要求的这…...
Websocket客户端从Openai Realtime api Sever只收到部分数据问题分析
目录 背景 分析 解决方案 背景 正常情况下,会从Openai Realtime api Sever收到正常的json数据,但是当返回音频数据时,总会返回非json数据。这是什么问题呢? 分析 期望的完整响应数据如下: {"session": {"inp…...
Unity 6 中的新增功能
Unity 6 是 Unity 的最新版本。 一、编辑器和工作流程 Unity 6 中引入的更改 在 Linux 上实现了将文件和资源从 Unity 拖放到外部应用程序的功能。将 Asset Manager for Unity 包添加到 Package Manager > Services > Content Management 部分中。此包允许用户轻松浏览…...
[ComfyUI]颜色提取插件,Flux专属,让出图更加可控
一、介绍 今天介绍这个好玩的插件 ComfyUI APQNodes,默认的Flux模型是无法理解准确的颜色代码。 而这个插件可以帮我忙将输入的十六进制颜色代码转换为 FLUX.1 Dev 已知的最相似的颜色名称(来自预先测试的 155 个颜色名称)。 所以就…...
【magic-dash】01:magic-dash创建单页面应用及二次开发
文章目录 一、magic-dash是什么1.1 安装1.2 使用1.2.1 查看内置项目模板1.2.2 生成指定项目模板1.2.3 查看当前magic-dash版本1.2.4 查看命令说明1.2.5 内置模板列表二、创建虚拟环境并安装magic-dash三、magic-dash单页工具应用开发3.1 创建单页面项目3.1.1 使用命令行创建单页…...
ChatGPT等大语言模型与水文水资源、水环境领域的深度融合
聚焦GPT等大语言模型与水文水资源领域的深度融合,通过系统化内容与实践案例,讲解如何高效完成时间序列分析、空间数据处理、水文模型优化以及智能科学写作等任务。同时,展示AI在高级机器学习模型开发、资源优化算法编程与模型微调中的最新应用…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
