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

相关推荐
向上的车轮2 小时前
MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
笔记·学习·matlab
躺着听Jay2 小时前
Oracle-相关笔记
数据库·笔记·oracle
田梓燊2 小时前
数学复习笔记 19
笔记·线性代数·机器学习
前端小崔3 小时前
从零开始学习three.js(18):一文详解three.js中的着色器Shader
前端·javascript·学习·3d·webgl·数据可视化·着色器
逼子格3 小时前
硬件工程师笔记——二极管Multisim电路仿真实验汇总
笔记·嵌入式硬件·硬件工程师·multisim·硬件工程师学习·电子器件·电路图
龙湾开发4 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(二)法线贴图
c++·笔记·学习·图形渲染·贴图
liang_20264 小时前
【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
数据结构·笔记·学习·算法·平面·总结
虾球xz4 小时前
游戏引擎学习第290天:完成分离渲染
c++·人工智能·学习·游戏引擎
虾球xz4 小时前
游戏引擎学习第285天:“Traversables 的事务性占用”
c++·学习·游戏引擎
汇能感知4 小时前
光谱相机的空间分辨率和时间分辨率
经验分享·笔记·科技