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

相关推荐
晓梦林3 小时前
BUUCTF findKey-学习笔记
笔记·学习
0566463 小时前
agent学习Day15——SQLAlchemy 查询过滤、分页与历史列表接口
python·学习·fastapi
炎武丶航6 小时前
汽车功能测试学习(1):FCW前方碰撞预警
功能测试·学习·汽车
x17388062736 小时前
XXE外部实体注入
xml·笔记
库玛西10 小时前
C++ 运行时多态 :核心总结与原理图解
c语言·c++·笔记
魔力女仆11 小时前
语言开发笔记3
笔记
x173880627312 小时前
文件包含漏洞介绍
笔记
qq_1851986912 小时前
SpingBoot3入门学习一
学习
噗噗夹的TA之旅12 小时前
Shader 学习 21:自定义 Render Feature
学习·游戏·unity·c#·游戏引擎·图形渲染
码农小韩13 小时前
AIAgent应用开发——大模型理论基础与应用(七)
python·学习·ai·大模型·agent