TApplication提供了一个事件OnException,专门供程序员处理TApplication捕捉到的异常,TApplication. OnException是捕捉数据库异常的最佳地点。 
  错误类型定义在sysutils单元中

解决方案 »

  1.   

    所有的错误类型定义在 ...\borland\delphi6\source\trl\Sys\sysutils.pas
    凡是 E 打头的几乎全是。
    但这些类型不一定包括数据库返回的错误信息。try
    ...
    except
     on E: Exception do Showmessage(E.Message);
    end;
    可以获得数据库返回的错误信息的内容。你也可以试试以下几种方法:
    try
     ...
    except
      on EZeroDivide do HandleZeroDivide;
      on EOverflow do HandleOverflow;
      on EMathError do HandleMathError;
    else
      HandleAllOthers;  //处理所有其它异常
    end;try
     ...
    except
      HandleException;  //默认处理
    end;
      

  2.   

    try
    ...
    except
     on E: Exception do Showmessage(E.Classname);
    end;
    可以返回错误的类型,但一般数据库错误会笼统的显示 EDatabaseError
      

  3.   

    try
        { try to connect server }
         ADOConnection1.Open();
    except
     on E: EADOError  do   
         ShowMessage('Connection failed!');
     else
         ShowMessage('Other errors');
    end;这样简单的错误处理,却不正确。
    首先,在except块中的代码未执行前,系统弹出了出错警告对话框。
    然后才执行except后面的语句。本来设想应显示'Connection failed!,
    但显示的却是'Other errors'!
    (前提:故意访问一个不存在的数据库,引发该错误。)
    请高手执教!
      

  4.   

    to huanggx(大侠):
    你在调试程序的时候是会这样的,Delphi会在每个Exception处中断。运行你的*.exe你会发现一切如你所愿。其实在Delphi弹出警告对话框后,你不是已经发现了程序实际进入了Except模块吗;为什么显示是'Other errors',是因为错误类型不是EADOError如果你想在调试时不想系统弹出警告对话框,菜单 Tools\Debugger Options...\Language Exceptions\Stop on Delphi Exceptions 的钩钩去掉;Tools\Debugger Options...\OS Exceptions\Handled by 选user program;on resume选 Run Unhandled
      

  5.   

    oracle_lover(数据库情人) 非常感谢你的回答。看来你是个中老手了。我只是初学者而已,对IDE环境和语言环境都不熟悉。
    刚才的问题基本解决了,那个错误的类型是EOleError。但是,这个底层错误的信息很不友好。不知道Delphi的Exception中有没有Exception ID这样的属性,以便我们能给出友好的信息?
      

  6.   

    我不确定Delphi的Exception中有没有Exception ID这样的属性,所以不敢说没有。
    我一般只是用ShowMessage(E.ClassName)找出错误的类型;其实在大多数情况下根本不关心错误的类型^_^
      

  7.   

    try
    ...
    except on E: Exception do
      Showmessage(E.Message);
    end;
      

  8.   

    try
    ...
    except
    on Exception do
    ...
    end;