在Delphi中处理DLL内部异常的正确方法是什么?
像这样的东西
on E : ESomeException do ...
或
if (E is ESomeException) then ...
失败,因为DLL和主应用程序的单独类型注册表。
答案 0 :(得分:8)
对于纯DLL,不允许异常跨越DLL边界(如Deltics提及) - 无论使用何种语言。
你得到all sorts of trouble there,特别是因为你不知道边界的每一边都有哪种语言,RTL,内存管理器等。
所以你回到了经典的错误处理范例:
而不是DLL,你可以使用BPL包(建议Lars):你知道双方将使用相同的RTL和内存管理器。
无论如何,包和BPL通常都会给你一个版本化的噩梦(太多的自由度)。
更严格的解决方案是使用单片可执行文件;这解决了这两个问题:
- 的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;
我已经准备好要破坏这个:)
这种方法有什么问题?什么是有潜在危险的?