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

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第2节(finally代码块)

9.2 finally 代码块

​ 还有第四个用于异常处理的关键字,我已经提到过,但到目前为止还没有使用过,那就是 finallyfinally块用于执行一些应始终执行的操作(通常是清理操作)。事实上,无论是否发生异常,finally 代码块中的语句都会被处理。只有在未出现异常或出现异常并已处理的情况下,才会执行 try 代码块后面的普通代码。换句话说,即使出现异常,finally 代码块中的代码也总是在 try 代码块的代码之后执行。

​ 请看这个方法(ExceptFinally 示例的一部分),它执行一些耗时的操作,并在窗体的标题中显示其状态:

procedure TForm1.BtnWrongClick(Sender: TObject);
varI, J: Integer;
beginCaption := 'Calculating';J := 0;// 长时间的(错误的)计算...for I := 1000 downto 0 doJ := J + J div I;Caption := 'Finished';Show('Total: ' + J.ToString);
end;

​ 由于算法中存在错误(因为变量 I 的值可以达到 0,而且还用于除法),程序会中断,但不会重置窗体标题。这就是 try-finally 块的作用:

procedure TForm1.BtnTryFinallyClick(Sender: TObject);
varI, J: Integer;
beginCaption := 'Calculating';J := 0;try// 长时间的(错误的)计算...for I := 1000 downto 0 doJ := J + J div I;Show('Total: ' + J.ToString);finallyCaption := 'Finished';end;
end;

​ 当程序执行该函数时,无论是否出现(任何类型的)异常,都会重置游标。此版本函数的缺点是无法处理异常。

9.2.1 finallyexcept

​ 耐人寻味的是,在 Object Pascal 语言中,一个 try 代码块后面可以跟一个 Exceptfinally 语句,但不能同时跟这两个语句。鉴于您经常希望同时使用这两个块,典型的解决方案是使用两个嵌套的 try 块,内部块与 finally 语句相关联,外部块与 except 语句相关联,或者根据情况反之亦然。下面是 ExceptFinally 示例中第三个按钮的代码:

procedure TForm1.BtnTryTryClick(Sender: TObject);
varI, J: Integer;
beginCaption := 'Calculating';J := 0;trytry// 长时间的(错误的)计算...for I := 1000 downto 0 doJ := J + J div I;Show('Total: ' + J.ToString);excepton E: EDivByZero dobegin// 使用新消息重新引发异常raise Exception.Create('Error in Algorithm');end;end;finallyCaption := 'Finished';end;
end;
9.2.2 使用 finally代码块恢复光标

try-finally 块的一个常见用例是资源的分配和释放。另一种相关情况是在操作完成后需要重置临时配置,即使该操作引发了异常。

​ 需要还原的临时配置设置的一个例子是沙漏光标,它在长时间操作中显示,并在操作结束后还原为原来的光标。即使代码很简单,也总有可能出现异常,因此应始终使用 try-finally 块。

​ 在 RestoreCursor 应用程序示例(一个 VCL 应用程序,因为 FireMonkey 中的光标管理比较复杂)中,我编写了以下代码,用于保存当前光标,将其临时设置为沙漏光标,并在操作结束时恢复原始光标:

varCurrCur := Screen.Cursor;Screen.Cursor := crHourGlass;
try// 一些耗时操作Sleep(5000);
finallyScreen.Cursor := CurrCur;
end;
9.2.3 使用托管记录恢复光标

​ 要保护资源分配或定义要还原的临时配置,可以使用托管记录来代替显式的 try-finally 块,这需要编译器添加一个固有的 finally 块。这样,即使在定义记录时需要付出一些初始努力,保护资源或恢复配置的代码编写量也会减少。

​ 这是一个托管记录,代表了上一节代码的相同行为,即在 Initialize 方法中将当前游标保存在一个字段中,并在 Finalize 方法中将其重置:

typeTHourCursor = recordprivateFCurrCur: TCursor;publicclass operator Initialize(out ADest: THourCursor);class operator Finalize(var ADest: THourCursor);end;class operator THourCursor.Initialize(out ADest: THourCursor);
beginADest.FCurrCur := Screen.Cursor;Screen.Cursor := crHourGlass;
end;class operator THourCursor.Finalize(var ADest: THourCursor);
beginScreen.Cursor := ADest.FCurrCur;
end;

一旦定义了这个托管记录:

varHC: THourCursor;
// 一些耗时操作
Sleep(5000);

注解:你可以在 Erik van Bilsen 的以下博文中找到更多通过托管记录保护资源的例子: https://blog.grijjy.com/2020/08/03/automate-restorable-operations-with-custom-managed-records/。这是一系列关于托管记录的详细博客的一部分。

相关文章:

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第2节(finally代码块)

9.2 finally 代码块 ​ 还有第四个用于异常处理的关键字,我已经提到过,但到目前为止还没有使用过,那就是 finally。finally块用于执行一些应始终执行的操作(通常是清理操作)。事实上,无论是否发生异常&…...

220 基于matlab的考虑直齿轮热弹耦合的动力学分析

基于matlab的考虑直齿轮热弹耦合的动力学分析,输入主动轮、从动轮各类参数,考虑润滑油温度、润滑油粘度系数等参数,输出接触压力、接触点速度、摩擦系数、对流传热系数等结果。程序已调通,可直接运行。 220直齿轮热弹耦合 接触压力…...

Intrigue Core:一款功能强大的攻击面枚举引擎

关于Intrigue Core Intrigue Core是一款功能强大的开源攻击面枚举引擎,该工具可以帮助广大研究人员更好地管理应用程序的攻击面。 Intrigue Core集成了各种各样的安全数据源,可以将这些数据提取到标准化的对象模型中,并通过图形数据库跟踪关…...

【精品PPT】智慧路灯大数据平台整体建设实施方案(免费下载)

1、知识星球下载: 如需下载完整PPTX可编辑源文件,请前往星球获取:https://t.zsxq.com/19QeHVt8y 2、免费领取步骤: 【1】关注公众号 方案驿站 【2】私信发送 【智慧路灯大数据平台】 【3】获取本方案PDF下载链接,直…...

idea 中运行spring boot 项目报 Command line is too long的解决办法。

Command line is too long 在这里选择edit configures 选择shrten command line , 选择 jar manifest 运行即可。...

Windows终端添加git bash

环境:windows11 终端:windows terminal git bash默认的界面不太好看,添加到终端会比较好用 步骤 打开 windows terminal,在向下箭头 点击 设置左侧栏 点击 “添加新配置文件”,如下图配置,主要修改项&…...

【方法】PDF密码如何取消?

对于重要的PDF文件,很多人会设置密码保护,那后续不需要保护了,如何取消密码呢? 今天我们来看看,PDF的两种密码,即“限制密码”和“打开密码”,是如何取消的,以及忘记密码的情况要怎…...

怎么开发一个预约小程序_一键预约新体验

预约小程序,让生活更便捷——轻松掌握未来,一键预约新体验 在快节奏的现代生活中,我们总是在不断地奔波,为了工作、为了生活,不停地忙碌着。然而,在这繁忙的生活中,我们是否曾想过如何更加高效…...

JavaScript_注释数据类型

JavaScript_语法_注释&数据类型: 1.2注释: 1.单行注释://注释内容 2.多行注释:/*注释内容*/ 1.3数据类型: 1.原始数据类型(基本数据类型):(只有这五种) 1.number:数字…...

蓝桥杯2020年第十一届省赛 CC++ 研究生组2.0

约数个数 #include<iostream> #include<cmath> using namespace std; int main(){int n 78120, ans 0, sqr sqrt(n);for(int i 1; i < sqr; i){if(n % i 0){ans;//printf("%d,", i);if(i * i ! n) {ans;//printf("%d,", n / i);}}}//…...

SOCKS5代理、代理IP、跨界电商、游戏技术与网络安全的综合探讨

在全球经济一体化的大背景下&#xff0c;"出海"已成为许多企业尤其是电商和游戏行业的重要战略方向。然而&#xff0c;随着企业业务的扩展到海外市场&#xff0c;网络安全、数据隐私和内容访问等问题也随之而来。本文将深入探讨SOCKS5代理、代理IP在跨界电商和游戏行…...

关于HTTP1.0、1.1、1.x、2.0、3.0与HTTPS之间的理解

关于HTTP1.0、1.1、1.x、2.0、3.0与HTTPS之间的理解 HTTP的由来 HTTP是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写。它的发展是万维网协会&#xff08;World Wide Web Consortium&#xff09;和Internet工作小组IETF&#xff08;Internet Eng…...

useRef总结

一、使用ref引用值 在react中ref的主要用途是用来获取DOM元素或者某个组件实例的引用。当你想访问真实的DOM节点&#xff0c;或者需要在组件之间共享可变数据且不需要触发重新渲染时&#xff0c;通常会使用ref。在vue中ref是响应式的&#xff0c;当数据发生改变时&#xff0c;相…...

计算机网络知识等汇总补充

计算机网络知识汇总补充 一、四次挥手1、为什么TCP要等待2MSL2、如果说一个系统中&#xff0c;有大量的time_wait和close_wait&#xff0c;会是什么原因&#xff1f; 二、你是怎么解决粘包问题&#xff1f;三、你觉得哪些场景适合redis四、redis的持久化策略五、你会怎么保证my…...

word中插入mathtype版的符号后,行间距变大解决方法

问题 解决方法 选中该段&#xff0c;设置固定值行距。如果是宋体&#xff0c;小四&#xff0c;1.25行距&#xff0c;那么固定值就为20磅。 成功解决。...

怎么给html文件本地启动一个服务去访问

首先得先安装node 要启动一个本地的 HTTP 服务器&#xff0c;请先安装 Node.js&#xff0c;然后通过命令行在 HTML 文件所在文件夹下运行 npx serve...

LabVIEW无线快速存取记录器(WQAR)测试平台

LabVIEW无线快速存取记录器&#xff08;WQAR&#xff09;测试平台 随着民用航空业的迅速发展&#xff0c;航空安全的保障日益成为公众和专业领域的关注焦点。无线快速存取记录器&#xff08;WirelessQuick Access Recorder, WQAR&#xff09;作为记录飞行数据、监控飞行品质的…...

12-pyspark的RDD算子注意事项总结

目录 相近算子异同总结相近变换算子异同foreach和foreachPartitionfold和reducecoalesce和repatition 相近动作算子异同cache和persist 算子注意事项需要注意的变换算子需要注意的动作算子 PySpark实战笔记系列第三篇 10-用PySpark建立第一个Spark RDD(PySpark实战笔记系列第…...

设备基础命令,路由基础

直连路由 静态路由 动态路由 根据路由器学习路由信息、生成并维护路由表的方法包括直连路由(Direct)、静态路由(Static)和动态路由(Dynamic)。直连路由&#xff1a;路由器接口所连接的子网的路由方式称为直连路由&#xff1b;非直连路由&#xff1a;通过路由协议从别的路由器…...

golang context

作用&#xff1a;用于在go协程中 传递上下文、超时、取消、传值 底层实现&#xff1a;是由互斥锁、channel、map来实现的 互斥锁&#xff1a;保护临界资源 channel: 用于信号通知&#xff0c;比如ctx.Done() map: 保存父ctx下派生的所有子ctx, 父ctx关闭&#xff0c;子ctx都关…...

为什么你的FastAPI AI接口在K8s里流式失败?——基于eBPF追踪的12层网络栈+ASGI生命周期时序图(含cgroup内存隔离失效证据)

第一章&#xff1a;FastAPI 2.0 异步 AI 流式响应对比评测报告FastAPI 2.0 原生强化了对 async/await 的深度支持&#xff0c;尤其在处理大语言模型&#xff08;LLM&#xff09;的逐 token 流式生成场景中&#xff0c;显著提升了吞吐量与首字节延迟&#xff08;TTFB&#xff09…...

深度解析ShardingCore:EF Core分库分表架构实战与性能优化指南

深度解析ShardingCore&#xff1a;EF Core分库分表架构实战与性能优化指南 【免费下载链接】sharding-core high performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库…...

Arduino Nano与SSD1306实战:从静态位图到动态动画的完整实现

1. Arduino Nano与SSD1306 OLED屏入门指南 如果你手头正好有一块Arduino Nano开发板和SSD1306驱动的OLED屏幕&#xff0c;想要实现从静态图片显示到动态动画的效果&#xff0c;那这篇文章就是为你准备的。我最近在做一个智能家居项目时&#xff0c;正好用到了这个组合&#xff…...

终极指南:如何快速实现CocoaHTTPServer自定义连接处理

终极指南&#xff1a;如何快速实现CocoaHTTPServer自定义连接处理 【免费下载链接】CocoaHTTPServer A small, lightweight, embeddable HTTP server for Mac OS X or iOS applications 项目地址: https://gitcode.com/gh_mirrors/co/CocoaHTTPServer CocoaHTTPServer是…...

告别手动配置!CCSv9.3一键导入MSP430F5529LP驱动库的两种高效方法

CCSv9.3高效配置指南&#xff1a;MSP430F5529LP驱动库的自动化管理方案 每次新建CCS工程都要重复添加库文件路径&#xff1f;这种低效操作早该被淘汰了。作为TI官方推荐的开发环境&#xff0c;Code Composer Studio其实隐藏着许多能大幅提升工作效率的高级功能。本文将彻底改变…...

系统资源全景掌控:TaskExplorer如何重塑进程管理体验

系统资源全景掌控&#xff1a;TaskExplorer如何重塑进程管理体验 【免费下载链接】TaskExplorer Power full Task Manager 项目地址: https://gitcode.com/GitHub_Trending/ta/TaskExplorer 在数字化办公环境中&#xff0c;系统卡顿、资源占用异常、进程无响应等问题时常…...

chronyd服务端123端口未启动的深度排查与修复指南

1. 问题现象与初步判断 最近在搭建NTP时间同步架构时遇到了一个典型问题&#xff1a;作为中转节点的Master服务器123端口未启动&#xff0c;导致下游ServerA设备无法同步时间。具体表现为执行chronyc sources命令时&#xff0c;客户端显示^?符号&#xff08;表示无法连接服务端…...

老旧Mac升级指南:OpenCore Legacy Patcher实现Monterey系统适配

老旧Mac升级指南&#xff1a;OpenCore Legacy Patcher实现Monterey系统适配 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着macOS系统不断迭代&#xff0c;许多经典Ma…...

DanKoe 视频笔记:一人企业构建指南:从零到百万美元的教育业务(每日工作2-4小时)

在本课程中&#xff0c;我们将学习如何构建一个单人教育业务&#xff0c;实现从零到年收入百万美元的目标&#xff0c;同时将每日工作时间控制在2-4小时。我们将探讨其核心理念、实施步骤以及背后的进化逻辑。 概述 传统的创业路径往往伴随着高风险、高投入和漫长的工作时间。…...

i.MX6ULL开发板无线SSH环境搭建指南

嵌入式开发板远程登录环境搭建指南1. 项目概述本技术文档详细记录了在基于i.MX6ULL处理器的嵌入式Linux开发板上搭建完整远程登录环境的实现方案。该方案包含三个核心组件&#xff1a;WiFi网络驱动移植、无线网络配置工具移植以及SSH服务部署。2. 硬件环境搭建2.1 WiFi模块选型…...