(delphi11最新学习资料) Object Pascal 学习笔记---第9章第1节(异常类的层次结构)

9.1.1 异常类的层次结构

​ 下面是运行时库的 System.SysUtils 单元中定义的核心异常类的部分列表(大多数其他系统库都在下面的核心列表中添加了自己的异常类型):

pascal 复制代码
Exception
	EArgumentException
		EArgumentOutOfRangeException
		EArgumentNilException
	EPathTooLongException
	ENotSupportedException
	EDirectoryNotFoundException
	EFileNotFoundException
	EPathNotFoundException
	EListError
	EInvalidOpException
	ENoConstructException
	EAbort
	EHeapException
		EOutOfMemory
		EInvalidPointer
	EInOutError
	EExternal
		EExternalException
		EIntError
			EDivByZero
			ERangeError
			EIntOverflow
		EMathError
			EInvalidOp
			EZeroDivide
			EOverflow
			EUnderflow
		EAccessViolation
		EPrivilege
		EControlC
		EQuit
	EInvalidCast
	EConvertError
	ECodesetConversion
	EVariantError
	EPropReadOnly
	EPropWriteOnly
	EAssertionFailed
	EAbstractError
	EIntfCastError
	EInvalidContainer
	EInvalidInsert
	EPackageError
	ECFError
	EOSError
	ESafecallException
	EMonitor
		EMonitorLockException
		ENoMonitorSupportException
	EProgrammerNotFound
	ENotImplemented
	EObjectDisposed
	EJNIException

注解:我不知道你是怎么想的,但我仍然需要弄清楚我认为最奇怪的异常类--有趣的 EProgrammerNotFound 异常---的确切使用场景!Delphi 库中隐藏着一些复活节彩蛋,这就是其中之一。

​ 现在,您已经看到了核心异常类的层次结构,我可以在前面关于 Except-on 语句的描述中补充一条信息:这些语句将依次进行评估,直到系统找到与异常对象类型相匹配的异常类为止。现在使用的匹配规则就是我们在上一章中研究过的类型兼容性规则:异常对象与其自身特定类型的任何祖先类型都是兼容的(就像 TDog 对象与 TAnimal 类兼容一样)。

​ 这意味着你可以拥有多个与异常相匹配的异常处理程序类型。如果你希望在处理更细粒度的异常(层次结构中的低级类)的同时,也能处理更通用的异常,以防前面的异常都不匹配,那么你就必须从更具体的异常到更通用的异常(或者从子异常类到父类)列出处理程序块。

此外,如果你为Exception类型编写了一个处理程序,它将是一个涵盖性子句,因此需要放在序列的最后。

下面是一个代码块中包含两个处理程序的代码片段:

pascal 复制代码
function DividePlusOne(A, B: Integer): Integer;
begin
  try
    Result := A div B; // 如果 B 等于 0 则出错
    Result := Result + 1;
  except
    on EDivByZero do
    begin
      Result := 0;
      MessageDlg('除以零错误', mtError, [mbOK], 0);
    end;
    on E: Exception do
    begin
      Result := 0;
      MessageDlg(E.Message, mtError, [mbOK], 0);
    end;
  end; // except 块结束
end;

​ 在这段代码中,同一个 try 代码块后有两个不同的异常处理程序。您可以使用任意数量的处理程序,这些处理程序将按上述顺序进行评估。

​ 请记住,为每一种可能的异常都使用一个处理程序通常不是一个好的选择。最好将未知异常留给系统处理。默认异常处理程序通常会在消息框中显示异常类的错误信息,然后恢复程序的正常运行。

**小贴士:**实际上,你可以通过为 Application.OnException 事件提供一个方法来修改正常的异常处理程序,例如,将异常信息记录到文件中,而不是显示给用户。

相关推荐
一隅论数智5 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20165 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本6 天前
离散数学第六课
学习·离散数学
AI职业加油站6 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
深圳老胡6 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光6 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊6 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
Because_of_Her16 天前
并查集-听课笔记
笔记·算法·并查集
霍霍的袁6 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio