我们的应用程序使用JCL记录导致异常的源代码行,并且它运行良好。 我用的是D2007。我有一个执行实际日志记录的TApplicationEvents.OnException事件。 考虑一下:
function MyFunc: String;
begin
// Codelines that may raise exception.
// Call functions that also may raise exception
end;
procedure ComplexFunc(aVariable: String);
begin
// also here can it be exceptions....
// Code here that is the cause of exception
end;
procedure foo;
var
myVar: String;
begin
myvar := MyFunc;
ComplexFunc(myvar);
end;
procedure TMainForm.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
LogLastException(E, 'Unhandled Exception (%s)', [E.Message], 20);
end;
我有3个方法和我的onException事件。 LogLastException在发生异常时记录callstack。问题是我无法在没有松散导致异常的源代码的情况下向E.Message添加信息。假设它是ComplexFunc中引发异常的第二行。我还想记录myvar变量的值。所以我将代码更改为:
function MyFunc: String;
begin
// Codelines that may raise exception.
// Call functions that also may raise exception
end;
procedure ComplexFunc(aVariable: String);
begin
// also here can it be exceptions....
// Code here that is the cause of exception
end;
procedure foo;
var
myVar: String;
begin
try
myvar := MyFunc;
ComplexFunc(myvar);
except
on E: Exception do
raise TException.CreateFmt('myvar = %s', [myvar]);
end;
end;
procedure TMainForm.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
LogLastException(E, 'Unhandled Exception (%s)', [E.Message], 20);
end;
现在记录myvar的值,但是我放弃了异常的原始源代码。而是记录带有raise TException.CreateFmt的行。有关如何做到这两点的任何建议吗?
此致
答案 0 :(得分:5)
除了Marjan Vennema的回答(我会遵循),你可以提出新的异常并使其看起来像来自旧异常的地址。
except
on E: Exception do
raise Exception.CreateFmt('myvar = %s', [myvar]) at ExceptAddr;
end;
答案 1 :(得分:3)
您正在丢失异常的原始源代码行,因为
except
on E: Exception do
raise TException.CreateFmt('myvar = %s', [myvar]);
end;
有效地处理原始异常(使其消失)并提出新异常。当然,这将有其自己的“异常来源线”。
@balazs'解决方案在新异常的消息中保留原始异常的源代码行。 @ Stephane的解决方案接近我将使用的解决方案。不幸的是,他只用myvar的值替换原始消息。我要做的是在原始邮件的顶部添加一行,然后重新引发异常:
except
on E: Exception do
begin
E.Message := Format('%s'#13#10'%s', [Format('MyVar: %s', [MyVar]), E.Message]);
raise;
end;
end;
答案 2 :(得分:2)
我试过这样的事吗?
try
myvar := MyFunc;
ComplexFunc(myvar);
except
on E: Exception do
begin
e.message := format('myvar = %s', [myvar]);
raise ;
end;
end;
答案 3 :(得分:1)
我不知道LogLastException是做什么的,但是如果你可以将它的结果重定向到一个字符串而不是你的日志,你可以像这样重新加载异常:
except
on E: Exception do
begin
str := LogLastExceptionToString(E, 'Unhandled Exception (%s)', [E.Message], 20);
raise TException.CreateFmt( str + 'myvar = %s message so far:' , [myvar]);
end;
end;
答案 4 :(得分:0)
一种简单的方法是定义一个全局变量,为其分配额外信息,然后在记录异常信息时将其内容添加到日志中。