Delphi中的异常和DLL

jpf*_*ius 4 delphi dll exception-handling

在Delphi中处理DLL内部异常的正确方法是什么?

像这样的东西

on E : ESomeException do ...
Run Code Online (Sandbox Code Playgroud)

要么

if (E is ESomeException) then ...
Run Code Online (Sandbox Code Playgroud)

失败,因为DLL和主应用程序的单独类型注册表.

Jer*_*ers 8

对于纯DLL,不允许异常跨越DLL边界(如Deltics提及) - 无论使用何种语言.

你会遇到各种各样的麻烦,特别是因为你不知道边界的每一边都有哪种语言,RTL,内存管理器等.

所以你回到了经典的错误处理范例:

您可以使用BPL软件包(如Lars建议的那样)代替DLL,您知道双方都将使用相同的RTL和内存管理器.

包和BPL通常都会给你一个版本化的噩梦(太多的自由度).

更严格的解决方案是使用单片可执行文件; 这解决了两个问题:

  • 更容易版本化
  • 保证只有一个RTL和内存管理器

--jeroen

PS:我已经做了一个额外的答案,因为这样可以更容易地粘贴链接.


Del*_*ics 5

最安全的方法是不允许异常首先从DLL中"逃逸".

但是,如果您无法控制DLL的源代码,因此无法确保这一点,您仍然可以测试异常类名称:

if SameText(E.ClassName, 'ESomeException') then ...
Run Code Online (Sandbox Code Playgroud)