(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 事件提供一个方法来修改正常的异常处理程序,例如,将异常信息记录到文件中,而不是显示给用户。

相关推荐
小小洋洋1 分钟前
BLE MESH学习1-基于沁恒CH582学习
学习
m0_689618281 小时前
水凝胶发生器,不对称设计妙,医电应用前景广
笔记
Ace'1 小时前
每日一题&&学习笔记
笔记·学习
IM_DALLA1 小时前
【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL25
学习·fpga开发·verilog学习
挥剑决浮云 -1 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
丶Darling.2 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
新晓·故知3 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
魔理沙偷走了BUG3 小时前
【数学分析笔记】第4章第4节 复合函数求导法则及其应用(3)
笔记·数学分析
z樾4 小时前
Github界面学习
学习