当前位置: 首页 > news >正文

【C#】try-catch-finally语句的执行顺序,以及在发生异常时的执行顺序

try-catch-finally语句

执行顺序

  1. 执行 try:程序首先尝试执行 try 块中的代码。如果在此期间没有发生异常,则跳过 catch 块,直接执行 finally 块(如果存在)。

  2. 发生异常时的处理

    • 如果在 try 块中发生了异常,并且有匹配的 catch 块可以处理该异常,那么程序会立即跳转到对应的 catch 块。
    • catch 块会处理异常,即执行异常处理逻辑。
    • 在 catch 块执行完毕后,无论是否抛出了新的异常或重新抛出原始异常,都会接着执行 finally 块(如果有)。
    • 如果在 catch 块中抛出了异常(无论是新异常还是通过 throw; 重新抛出原始异常),这个异常会在 finally 块执行之后继续向上层传播。
  3. 执行 finally:不论是否发生异常,也不论异常是否被处理,finally 块中的代码总是会在 try 和所有 catch 块执行完毕后被执行。这是确保资源清理和状态恢复的重要机制。

  4. 后续执行finally 块执行完成后,程序会根据是否有未捕获的异常来决定接下来的行为。如果没有未捕获的异常,程序将继续正常执行;如果有未捕获的异常,异常将向上传播给调用栈中的上一级方法,直到找到合适的异常处理器或者程序终止。

 

特殊情况

  • 如果 finally 块中有 return 语句、throw 语句、goto 语句等控制转移语句,这可能会改变正常的执行流程,但一般不推荐这样做,因为这会使代码行为变得复杂和难以预测。
  • 如果 try 或 catch 块中有 return 语句,finally 块仍然会在返回值计算完毕但尚未返回给调用者之前执行。
  • 强制退出应用程序(如调用 Environment.Exit())、线程被中止、计算机断电等情况会导致 finally 块可能不会被执行。

 

注意点

catch 块中使用 throw 语句重新抛出异常或抛出一个新的异常时,finally 块仍然会在异常传播之前执行。这是编程语言(如 Java 和 C#)的正常行为,确保了资源可以被正确清理。

执行顺序如下:

  1. 首先尝试执行 try 块中的代码。
  2. 如果 try 块中发生了异常,并且有匹配的 catch 块,则执行该 catch 块。
  3. 在 catch 块执行完毕后,不论是否在其中抛出了新的异常,都会执行 finally 块。
  4. 最后,如果在 catch 中抛出了异常,这个异常会继续向上层传播。

因此,在 catch 块中抛出异常不会阻止 finally 块的执行;finally 块总是会在控制流离开 try-catch 结构之前被执行。

需要注意的是,finally 块中的代码应该尽量避免再次抛出未捕获的异常,因为这可能会掩盖原始异常。此外,如果 finally 块中有返回语句或抛出异常,它可能会影响从 trycatch 块中已经发生的返回或抛出操作。在大多数情况下,应该避免这种情况,以保持代码的行为可预测。

 

代码示例

展示了 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()&#xff…...

解决 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在高级机器学习模型开发、资源优化算法编程与模型微调中的最新应用…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Selenium常用函数介绍

目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...