用Application.OnException如何对异常进行分类?

Michaelyfj 2001-10-24 08:19:43
用Application.OnException如何对异常进行分类?
在OnException(...)的异常参数中分类,
如把异常分为:EDbEngineError, EConvertError等
...全文
423 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Michaelyfj 2001-10-30
  • 打赏
  • 举报
回复
有没有哪位高手知道
cobi 2001-10-30
  • 打赏
  • 举报
回复
taozc(陶)的整理的确有新意,但是如果要在程序中应用的话,恐怕就必须要对所有的异常全部了解。
在sysutil单元中,对异常有详细的定义。如果需要翻译运行中的异常,需要把这些异常全部翻译并列在一个unit中。当程序中使用try..except捕获到异常的时候,可以首先把它的类读出,然后在unit中找到对应的翻译,然后再显示出来。即达到:
if e is EDBEngineError then showmessage('数据库错误');
if E is EConvertError then showmessage('转换错误');
类似的效果
taozc 2001-10-30
  • 打赏
  • 举报
回复
刚刚整理好,请看:
program test;

uses
Forms,
Windows,
SysUtils,
classes,
menus,
db;

{$R *.RES}

Type
TMyErrCls=Class(TObject)
Public
Procedure MyExceptionHandler(Sender:TObject;EInstance:Exception);
end;

//------------------------------------------------------------
{编写自己的异常处理句柄}
procedure TMyErrCls.MyExceptionHandler(Sender:TObject; EInstance:Exception);
var
ErrorFile:TextFile;
FileName,ETips:string;
Content:string;
FindFlag:Boolean;
Begin
{截获出现的异常,并存入文件ErrorInfo.txt.}
FileName:='.\ErrorInfo.txt';
//打开文件
AssignFile(ErrorFile,FileName);

if (not FileExists(FileName)) then ReWrite(ErrorFile);
ReSet(ErrorFile);
//检查今天是否有异常事件记录在文件ErrorInfo.txt中
ETips:=formatdatetime('yyyy''年''mm''月''dd''日',now);
FindFlag:=false;
While not SeekEof(ErrorFile) do
begin
Readln(ErrorFile,Content);
if Pos(ETips,Content)<>0 then
begin
FindFlag:=True;
break;
end;
end;
Append(ErrorFile);
//今天未有异常事件记录,则加入一行直线隔开。
if (not FindFlag) then Writeln(ErrorFile,'-------------------------------------------------------------------------------');
ETips:=ETips+formatdatetime('''_''hh''时''nn''分''ss''秒-->',now);
Writeln(ErrorFile,ETips+EInstance.ClassName+':'+EInstance.Message);
{关闭文件}
CloseFile(ErrorFile);
{对出现的异常显示中文提示}
If EInstance is EDivByZero then
ETips:='除数不能为零!'
else if EInstance is EAccessViolation then
ETips:='访问了无效的内存区域!'
else if (EInstance is EDatabaseError) then
ETips:='数据库操作出现错误!'
else if (EInstance is EFOpenError) then
ETips:='文件不能打开!'
else if (EInstance is EReadError) then
ETips:='文件不能正确读出!'
else if (EInstance is EWriteError) then
ETips:='文件不能写入!'
else if (EInstance is EConvertError) then
ETips:='非法的类型转换!'
else if (EInstance is EInOutError) then
ETips:='请将磁盘插入驱动器!'
else if (EInstance is EMenuError) then
ETips:='程序主菜单出现错误!'
else if (EInstance is EOutOfMemory) then
ETips:='内存不足!'
else
ETips:=EInstance.ClassName+':'+EInstance.Message;
Application.MessageBox(PChar(ETips),'错误',MB_OK+MB_ICONSTOP);
end;


var
MyErrObj: TMyErrCls; {声明TMyClass类的一个变量}

begin
Application.Initialize;
MyErrObj:=TMyErrCls.Create; {创建TMyClass类的一个实例}
Application.OnException:=MyErrObj.MyExceptionHandler; {响应OnException事件}
Application.Run;
end.

taozc 2001-10-30
  • 打赏
  • 举报
回复
我有个例程,实现功能:当你想截获的错误出现时弹出消息框提示,并将错误记录到一个指定的文本中,要的话我把它整理出来发给你。
请留下你的E-Mail。(我的是:taozc@263.net)
Michaelyfj 2001-10-30
  • 打赏
  • 举报
回复
能否象下面这样定义:
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
if e is EDBEngineError then showmessage('数据库错误');
if E is EConvertError then showmessage('转换错误');
...
end;
我想在这里知道E具体指哪种异常
kevin_gao 2001-10-30
  • 打赏
  • 举报
回复
用E is EDbEngineError就不能在这里控制,只能在异常出现的时候进行控制。

这句话是什么意思?你不是要的就是异常出现的时候控制吗?

不知道你的具体要求,可以考虑raise自定义的异常。
hellion 2001-10-24
  • 打赏
  • 举报
回复
用E is EDbEngineError等
为什么要在这里控制呀
dongys_2000 2001-10-24
  • 打赏
  • 举报
回复
那你的去截获application的消息
Michaelyfj 2001-10-24
  • 打赏
  • 举报
回复
我想通过Application.OnException来捕获整个应用程序的异常,因此在这里控制,。
用E is EDbEngineError就不能在这里控制,只能在异常出现的时候进行控制。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧