• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

DelphiHandleException

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

初在Delphi里进行处理错误时,最常用的做法是try….except ….end. 例如:

try
    raise Exception.Create('Error Message');
  except
    on e:Exception do
    begin
      ShowMessage(e.Message);
    end;

  end;

 

而现在要说的是另外的一种做法:

var
  ExceptionObj : TObject;
begin
  { Simulate an access violation. }
  try
    System.Error(reAccessViolation);
  except
    ExceptionObj := ExceptObject;
    if ExceptionObj <> nil then
    begin
      MessageDlg(ExceptionObj.ToString, mtError, [mbOK], 0);
    end;
  end;
end;

在上面的代码,使用了ExceptObject这个对象,这个对象是在System单元中定义的,用于返回当前正在处理的错误对象,如果没有发生错误,其值为nil。当错误变量(在try..except里定义的)不可访问时,ExceptObject就显得很有用,例如当错误处理代码调用一个函数进行错误处理时。

需要注意的是,当错误处理完毕后,ExceptionObject返回的将是nil。还有可能会用到的一个函数是AcquireExceptionObject。这个函数返回当前except 对象的指针,这个函数的作用是为了防止当前的except对象被释放掉。AcquireExceptionObject是通过引用计数进行操作的。

 

下面是delphi的错误处理的代码:

procedure TForm2.btIOErrorClick(Sender: TObject);
var
  ExceptionObj : TObject;
begin
  {
  Try to write something onto the console--it will raise an
  exception.
  }
  try
  WriteLn('This will generate an error because there is no' +
          ' console attached!');
  except
    ExceptionObj := ExceptObject;
    if ExceptionObj = nil then
      MessageDlg('No exception', mtError, [mbOK], 0)
    else
    begin
      MessageDlg(ExceptionObj.ToString, mtError, [mbOK], 0);
    end;
  end;
end;
 
{$OVERFLOWCHECKS ON}
{$OPTIMIZATION OFF}
{$HINTS OFF}
procedure TForm2.btOverflowErrClick(Sender: TObject);
var
  b : Cardinal;
  ExceptionPtr : Pointer;
begin
  {
  Simulate an overflow. Note: Enable the overflow
  checking and disable optimizations, because the Delphi
  compiler will not compile this code otherwise.
  }
  ExceptionPtr := nil;
  try
    b := $FFFFFFFF;
    b := b * b;
  except
    ExceptionPtr := AcquireExceptionObject;
  end;
 
  // Check exception.
  if ExceptionPtr = nil then
    MessageDlg('No exception', mtError, [mbOK], 0)
  else
  begin
    MessageDlg(TObject(ExceptionPtr).ToString, mtError, [mbOK], 0);
    ReleaseExceptionObject;
  end;
end;
{$HINTS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
 
procedure TForm2.btRuntimeErrorClick(Sender: TObject);
var
 
  ExceptionObj : TObject;
  begin
  { Simulate an access violation. }
  try
    System.Error(reAccessViolation);
  except
    ExceptionObj := ExceptObject;
    if ExceptionObj = nil then
      MessageDlg('No exception', mtError, [mbOK], 0)
    else
    begin
      MessageDlg(ExceptionObj.ToString, mtError, [mbOK], 0);
    end;
  end;
end;
 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
delphi的常用条件编译指令---{$IFDEF}{$UNDEF}{$IFDEF}{$ELSE}{$ENDIF}发布时间:2022-07-18
下一篇:
2.Matlab数值数组及其运算发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap