Delphi中的异常和DLL

时间:2010-02-12 07:45:32

标签: delphi dll exception-handling

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

像这样的东西

on E : ESomeException do ...

if (E is ESomeException) then ...

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

4 个答案:

答案 0 :(得分:8)

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

你得到all sorts of trouble there,特别是因为你不知道边界的每一边都有哪种语言,RTL,内存管理器等。

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

而不是DLL,你可以使用BPL包(建议Lars):你知道双方将使用相同的RTL和内存管理器。

无论如何,包和BPL通常都会给你一个版本化的噩梦(太多的自由度)。

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

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

- 的Jeroen

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

答案 1 :(得分:5)

最安全的方法是不允许异常首先从DLL中“逃逸”。

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

if SameText(E.ClassName, 'ESomeException') then ...

答案 2 :(得分:3)

如果你的应用程序和你的dll都使用运行时包(至少是rtlxx.bpl),那么两者都有相同的类型,它将起作用。当然,这仅限于将dll用于Delphi / BCB。

另一种解决方案是不像Deltics建议那样使用例外。返回错误代码。

或使用COM。然后你可以有例外,不限制你的dll到Delphi。

答案 3 :(得分:-2)

这种解决方法似乎是为我做的:

 function ExceptionMatch (Exc : Exception; ExcClass : TClass) : Boolean;

 var
    CurrClass           : TClass;

  begin
  CurrClass := Exc.ClassType;
  while (CurrClass <> nil) do
    begin
    if SameText (CurrClass.ClassName, ExcClass.ClassName) then
      Exit (True);
    CurrClass := CurrClass.ClassParent;
    end;
  Result := False;
  end;

我已经准备好要破坏这个:)

这种方法有什么问题?什么是有潜在危险的?