(delphi11最新学习资料) Object Pascal 学习笔记---第9章第1节(Try-Except块)

9.1 Try-Except块

​ 让我从一个相当简单的 try-except 示例(ExceptionsTest 示例的一部分)开始,这个示例有一个通用的异常处理块:

function DividePlusOne(A, B: Integer): Integer;
begintry// 如果B等于0,则引发异常Result := A div B;Inc(Result);exceptResult := 0;end;// 更多代码
end;

注解:在 Delphi 调试器中运行程序时,如果遇到异常,即使有异常处理程序,调试器也会默认停止程序。当然,这通常是你想要的,因为你想知道异常发生的位置,并逐步查看处理程序的调用过程。如果你只想让程序在异常处理完毕后运行,看看用户会看到什么,可以使用 "不调试运行"命令运行程序,或者在调试器选项中禁用所有(或某种)异常。

​ 像上面的代码那样 "沉默 "异常并将结果设置为零,在实际应用中并没有太大意义(因为向用户掩盖这样的错误通常是不好的做法),但这段代码的目的是帮助你理解简单场景中的核心机制。

​ 这是用于调用该函数的事件处理程序的代码:

varN: Integer;
beginN := DividePlusOne(10, Random(3));Show(N.ToString);

​ 正如您所看到的,程序使用随机生成的值,因此当您点击按钮时,您可能处于有效状态(3 次中的 2 次),也可能处于无效状态。这样就有了两种不同的程序流程:

  • 如果B不为零,则程序执行除法,执行递增,然后跳过except块,进入紧跟后面的end语句(// 更多)。
  • 如果B为零,则除法引发异常,跳过所有后续语句(在这种情况下只有一个语句),直到第一个封闭的try-except块执行。在异常块之后,程序不会回到原始语句,而是跳过except块, 执行其后的第一条语句(// 更多)。

​ 描述这种异常模型的一种方法是,它遵循一种非恢复的方法。如果出现错误,试图处理错误条件并返回到导致错误的语句是非常危险的,因为此时程序的状态很可能是未定义的。异常会极大地改变执行流程,跳过下面语句的执行并回滚堆栈,直到找到适当的错误处理代码。

​ 上面的代码具有一个非常简单的except块,没有on语句。当您需要处理多种类型的异常(或多个异常类类型)或者要访问传递给代码块的异常对象,则需要一个或多个 on 语句:

function DividePlusOneBis(A, B: Integer): Integer;
begintryResult := A div B; // 如果B等于0则错误Result := Result + 1;excepton E: EDivByZero dobeginResult := 0;ShowMessage(E.Message);end;end;
end;

​ 在异常处理语句中,我们捕获了运行时库定义的 EDivByZero 异常。有许多这样的异常类型,它们指的是运行时问题(如除以零或错误的动态转换)、系统问题(如内存不足错误)或组件错误(如索引无效)。所有这些异常类都继承自基类 Exception,后者提供了一些最基本的功能,如我在上面代码中使用的 Message 属性。这些类实际形成了一个具有一定逻辑的层次结构。

注解:Object Pascal 中的类型一般以字母 T 开头,而异常类则例外,一般以字母 E 开头。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WKWebView生成PDF

一、简介 在使用 WKWebView 将网页内容保存为 PDF 文件时,您可以设置打印页面的大小和可打印区域,以确保生成的 PDF 文件符合您的需求。在 WKWebView 中,您可以使用 UIPrintPageRenderer 类的 paperRect 和 printableRect 属性来设置页面的大…

题目:#if #ifdef和#ifndef的综合应用。

题目:#if #ifdef和#ifndef的综合应用。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated s…

裸机编程与RTOS编程:理解模式差异与实例说明

裸机编程和RTOS(实时操作系统)编程是嵌入式系统开发中的两种主要编程模式,它们在资源管理、任务调度、并发处理、实时性保证等方面存在显著差异。本文将详细阐述这两种编程模式的特点、模式差异,并通过实例进行说明。 一、裸机编…

3D Web轻量引擎HOOPS Communicator装配制造流程演示

介绍 该演示介绍了使用HOOPS Communicator的独特工作流程,该工作流程从零件列表中加载零件,并使用自定义配合操作符(例如共线、同心和共面)构建装配模型。该工作流程可用于各种行业,例如维护手册、工作指令或电子商务…

BMS基础之锂电池充放电特性

磷酸铁锂电池 它充电在3.3V以后,会有一个猛地增加,所以3.3v其实就是他的饱和电压,如果继续充电就会损坏电池,同理放电到一定程度电压就会急剧下降,过放也会损坏电池(充放电截止电压) 三元锂电…

Spring、SpringMVC、Springboot三者的区别和联系

1.背景 最近有人问面试的一个问题:Spring、SpringMVC、Springboot三者的区别和联系,个人觉得:万变不离其宗,只需要理解其原理,回答问题信手拈来。 2.三者区别和联系 2.1 先了解Spring基础 Spring 框架就像一个家族…

oracle回收表空间

1. 手工计算实际大小 col owner format a20 col table_name format a40 col "act/block %" format 9999999 select owner, table_name, tablespace_name, act_size, block_size, block_size - act_size, round(act_size /…

Social Skill Training with Large Language Models

Social Skill Training with Large Language Models 关键字:社交技能训练、大型语言模型、人工智能伙伴、人工智能导师、跨学科创新 摘要 本文探讨了如何利用大型语言模型(LLMs)进行社交技能训练。社交技能如冲突解决对于有效沟通和在工作和…

线程的666种状态

文章目录 在Java中,线程有以下六种状态: NEW:新建状态,表示线程对象已经被创建但还未启动。RUNNABLE:可运行状态,表示线程处于就绪状态,等待系统分配CPU资源执行。BLOCKED:阻塞状态…

SpringBoot的旅游管理系统+论文+ppt+免费远程调试

项目介绍: 基于SpringBoot旅游网站 旅游管理系统 本旅游管理系统采用的数据库是Mysql,使用SpringBoot框架开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 (1&…

003 静态代理

文章目录 StudentServiceImplStudentService.javaStudentServiceProxy.javaStudentServiceProxy1.javaStudentServiceProxyTest.java StudentServiceImpl package com.aistart.service.impl;import com.aistart.mapper.StudentMapper; import com.aistart.pojo.Student; import…

想进阶为 Go 语言高级开发工程师吗?那么,一定要阅读此文!

大家好,我是孔令飞,字节跳动云原生开发专家、前腾讯云原生技术专家;《企业级Go项目开发实战》作者,云原生实战营 知识星球星主; 我们知道,Go 出自名门 Google 公司,是一门支持并发、垃圾回收的编…

如何快速开启一个项目-ApiHug - API design Copilot

ApiHug101-001开启篇 🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin |…

ClickHouse 介绍

前言 一个通用系统意味着更广泛的适用性,但通用的另一种解释是平庸,因为它无法在所有场景内都做到极致。 ClickHouse 在没有像三驾马车这样的指导性论文的背景下,通过针对特定场景的极致优化,获得闪电般的查询性能。 ClickHous…

[StartingPoint][Tier2]Oopsie

Task 1 With what kind of tool can intercept web traffic? (哪种工具可以拦截web数据包) proxy Task 2 What is the path to the directory on the webserver that returns a login page? (路径到返回登录页面的 Web 服务器目录是什么?) /cdn-cgi/login Tas…

标定系列——Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译(二十)

Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译 说明下载安装步骤1.更新2.安装必要的依赖包3.下载源码包并解压4.终端运行如下命令5.添加配置路径6.验证安装是否成功 说明 Ubuntu18.04下对opencv-4.5.3与opencv_contrib-4.5.3源码编译 下载 CSDN下载 安装步骤 …

gin+sse实现离散的消息通知

虽然网上的都是用sse实现将实时消息流不间断的推给前端,但是sse也可以模拟websocket进行突发的消息通知,而不是一直读取数据并返回数据。即服务端保存所有的连接对象,前端管理界面发送正常的http请求,在后端遍历所有的连接对象&am…

解码AAC裸流为PCM写入文件

使用AAC裸流解析器将aac裸流文件解析为pcm数据&#xff0c;然后写入文件 #include "myLog.h" #include <iostream>extern "C" { #include <libavcodec\avcodec.h> }#define AUDIO_INBUF_SIZE 20480 // 读取 20KB数据 #define AUDIO_REFILL_…

# C++之functional库用法整理

C之functional库用法整理 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的function库用法整理 C之functional库用法整理一、functional库的内建仿函数1. 存储和调用函数2. 存…

rust-tokio发布考古

源头&#xff1a; Carl Lerche Aug 4, 2016 ​ I’m very excited to announce a project that has been a long time in the making. 我很兴奋地宣布一个酝酿已久的项目。 Tokio is a network application framework for rapid development and highly scalable deployments…