我想通过Application.OnException来捕获整个应用程序的异常,因此在这里控制,。 用E is EDbEngineError就不能在这里控制,只能在异常出现的时候进行控制。
那你的去截获application的消息
用E is EDbEngineError就不能在这里控制,只能在异常出现的时候进行控制。 这句话是什么意思?你不是要的就是异常出现的时候控制吗? 不知道你的具体要求,可以考虑raise自定义的异常。
能否象下面这样定义: procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if e is EDBEngineError then showmessage('数据库错误'); if E is EConvertError then showmessage('转换错误'); ... end; 我想在这里知道E具体指哪种异常
刚刚整理好,请看: 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(陶)的整理的确有新意,但是如果要在程序中应用的话,恐怕就必须要对所有的异常全部了解。 在sysutil单元中,对异常有详细的定义。如果需要翻译运行中的异常,需要把这些异常全部翻译并列在一个unit中。当程序中使用try..except捕获到异常的时候,可以首先把它的类读出,然后在unit中找到对应的翻译,然后再显示出来。即达到: if e is EDBEngineError then showmessage('数据库错误'); if E is EConvertError then showmessage('转换错误'); 类似的效果
用E is EDbEngineError就不能在这里控制,只能在异常出现的时候进行控制。
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
if e is EDBEngineError then showmessage('数据库错误');
if E is EConvertError then showmessage('转换错误');
...
end;
我想在这里知道E具体指哪种异常
请留下你的E-Mail。(我的是:[email protected])
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.
在sysutil单元中,对异常有详细的定义。如果需要翻译运行中的异常,需要把这些异常全部翻译并列在一个unit中。当程序中使用try..except捕获到异常的时候,可以首先把它的类读出,然后在unit中找到对应的翻译,然后再显示出来。即达到:
if e is EDBEngineError then showmessage('数据库错误');
if E is EConvertError then showmessage('转换错误');
类似的效果