用E is EDbEngineError等
为什么要在这里控制呀

解决方案 »

  1.   

    我想通过Application.OnException来捕获整个应用程序的异常,因此在这里控制,。
    用E is EDbEngineError就不能在这里控制,只能在异常出现的时候进行控制。
      

  2.   

    那你的去截获application的消息
      

  3.   

    用E is EDbEngineError就不能在这里控制,只能在异常出现的时候进行控制。 这句话是什么意思?你不是要的就是异常出现的时候控制吗? 不知道你的具体要求,可以考虑raise自定义的异常。
      

  4.   

    能否象下面这样定义:
    procedure TForm1.ApplicationEvents1Exception(Sender: TObject;  E: Exception);
    begin
      if e is EDBEngineError then showmessage('数据库错误'); 
      if E is EConvertError  then showmessage('转换错误');
      ...
    end;
    我想在这里知道E具体指哪种异常
      

  5.   

    我有个例程,实现功能:当你想截获的错误出现时弹出消息框提示,并将错误记录到一个指定的文本中,要的话我把它整理出来发给你。
    请留下你的E-Mail。(我的是:[email protected])
      

  6.   

    刚刚整理好,请看:
    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.
      

  7.   

    taozc(陶)的整理的确有新意,但是如果要在程序中应用的话,恐怕就必须要对所有的异常全部了解。
    在sysutil单元中,对异常有详细的定义。如果需要翻译运行中的异常,需要把这些异常全部翻译并列在一个unit中。当程序中使用try..except捕获到异常的时候,可以首先把它的类读出,然后在unit中找到对应的翻译,然后再显示出来。即达到:
      if e is EDBEngineError then showmessage('数据库错误'); 
      if E is EConvertError  then showmessage('转换错误');
    类似的效果