我有这个方法,我执行一个sql语句并在try except语句中捕获错误
AdoQuery := TAdoQuery.Create(self);
AdoQuery.connection := AdoConnection;
AdoQuery.SQL.Add(sqlStr);
AdoQuery.Prepared := true;
try
begin
AdoQuery.ExecSql;
AdoQuery.Active := false;
end;
except on e:eAdoError do
ShowMessage('Error while creating the table: ' + e.Message);
end;
我可以抓住这样的错误并将其显示给用户,但它会为用户显示一些无用的信息。我只想显示错误的%msg
部分,请看一下图片:
我认为e.MEssage
允许我只获得%msg
部分,但它给了我一个随机用户难以理解的全部内容。在这种情况下,我如何只得到有用的信息
表reftabtest.rPCE已存在
谢谢。
答案 0 :(得分:2)
您可以使用TADOConnection
对象的Errors
属性,您想要的是Description
对象的Error
成员。
在你的情况下:
function ParseOBDCError(ErrorDescription : String) : String;
var
Ps : Integer;
Pattern : String;
begin
Pattern := '%msg:';
Ps := Pos(Pattern, ErrorDescription);
if Ps > 0 then
begin
Result := Copy(ErrorDescription, Ps+Length(Pattern)+1);
// if you want, you can clean out other parts like < and >
Result := StringReplace(Result, '<', , '', [rfReplaceAll]);
Result := StringReplace(Result, '>', , '', [rfReplaceAll]);
Result := Trim(Result);
end
else
Result := ErrorDescription;
end;
...
AdoQuery := TAdoQuery.Create(self);
AdoQuery.connection := AdoConnection;
AdoQuery.SQL.Add(sqlStr);
AdoQuery.Prepared := true;
try
AdoQuery.ExecSql;
AdoQuery.Active := false;
except on e : Exception do
begin
if AdoConnection.Errors.Count > 0 then
ShowMessageFmt('Error while creating the table: %s',
[ParseOBDCError(AdoConnection.Errors[0].Description)])
else
ShowMessageFmt('something went wrong here: %s', [e.Message]);
end;
end;
答案 1 :(得分:0)
ShowMessage()
代码未显示该消息对话框。
首先,图标错误 - 这不是ShowMessage
图标
其次,您在邮件中添加的文本('Error while creating the table: '
)丢失了。
这意味着您的异常吞没者没有捕获异常,因为它不属于EADOError
类。所以正在发生的是应用程序的默认异常处理程序显示异常。
在我解释如何解决之前,我需要指出你的异常吞噬者是错误的(不应该将你的错误命名为异常处理程序)。
因为你吞下了异常:如果另一种方法调用你的方法,那么 错误地 认为你的方法成功了,并且可能做一些不应该做的事情。您永远不应该编写代码,假设没有重要的调用堆栈通向您的方法。
吞咽向用户显示消息没有帮助,因为它隐藏了程序其余部分的错误。特别是因为,正如您所看到的:在一个地方已经有代码告诉用户错误没有将其隐藏在程序的其余部分。 (你遇到的问题是你想要一个更友好的消息。)
修复它:
首先找出实际的异常类是什么,这样你就能捕获到正确的错误。
现在你有很多选择,但最简单的如下:
Abort
。这引发了EAbort
异常,按照惯例,这是一个“无声异常”。它告诉程序的其余部分存在错误(因此假设一切正常,它不会做任何事情)。但按照惯例,任何进一步的异常处理程序都应该不向用户显示另一条消息。这包括您问题中的默认处理程序对话框。EAbort
条消息,则应修复此问题。