用户友好的异常错误delphi

时间:2014-10-06 07:29:14

标签: delphi error-handling message

我有这个方法,我执行一个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部分,请看一下图片:

enter image description here

我认为e.MEssage允许我只获得%msg部分,但它给了我一个随机用户难以理解的全部内容。在这种情况下,我如何只得到有用的信息

  

表reftabtest.rPCE已存在

谢谢。

2 个答案:

答案 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类。所以正在发生的是应用程序的默认异常处理程序显示异常。


在我解释如何解决之前,我需要指出你的异常吞噬者是错误的(不应该将你的错误命名为异常处理程序)。

因为你吞下了异常:如果另一种方法调用你的方法,那么 错误地 认为你的方法成功了,并且可能做一些不应该做的事情。您永远不应该编写代码,假设没有重要的调用堆栈通向您的方法。

吞咽向用户显示消息没有帮助,因为它隐藏了程序其余部分的错误。特别是因为,正如您所看到的:在一个地方已经有代码告诉用户错误没有将其隐藏在程序的其余部分。 (你遇到的问题是你想要一个更友好的消息。)


修复它:

首先找出实际的异常类是什么,这样你就能捕获到正确的错误。

现在你有很多选择,但最简单的如下:

  • 首先记录异常,最好是使用调用堆栈。您不希望陷入用户获得友好消息的情况,但如果您需要进行一些调试,那么您作为开发人员会丢失关键信息。
  • 要获得调用堆栈,您可以考虑第三方工具,例如Mad Except,Exceptional Magic,JCLDebug等等。
  • 现在向用户显示消息。
  • 最后致电Abort。这引发了EAbort异常,按照惯例,这是一个“无声异常”。它告诉程序的其余部分存在错误(因此假设一切正常,它不会做任何事情)。但按照惯例,任何进一步的异常处理程序都应该向用户显示另一条消息。这包括您问题中的默认处理程序对话框。
  • 如果默认处理程序不正确显示EAbort条消息,则应修复此问题。