如何截获错误(100分)

  • 主题发起人 主题发起人 ayay
  • 开始时间 开始时间
A

ayay

Unregistered / Unconfirmed
GUEST, unregistred user!
我是在SQLSERVER下用DBGRID和TABLE进行操作,
TABLE是动态连接表名,当在DBGRID中输入数据时,如日期型,输入错误
则系统给报错,我如何截获该错误信息?
因动态连接表故字段名之前并不知道。
 
Application.OnException
 
try
....
except
....
end;
 
procedure ExceptionProc;
begin
......
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := ExceptionProc;
end;
 
try
query.exec;
execept
showmessage('有错 ')
end;
什么错?怕是要到数据库后到去抓.
 
任何错误都是可以在ApplicationEvents.OnException中截获的(D5已经有了
ApplicationEvents控件).不过要做错误类型判断
当然也可以用
try
execept
......
end;
来截获.

 
错误信息在DBGRID中,如是日期型,输入错误则报错,
我应该在那里写各位大侠说的代码,因为在输入时不做任何处理
只是换行就报错了
 
补充:

try
...
except
On E: EDatabaseError do begin
ShowMessage('数据库错误');
end;
On E: EDBEngineError do begin
ShowMessage('BDE 出错,可知更好的消息,包括原始错误!!');
end;
end;
 
OnBeforePost
 
自己做个过程处理这个Application.OnException
过程中判断E.Message有则翻译我则保存以备以后翻译
可放在数据库中
Table1(hint,error,date,blob)
以后的事自己想吧!
我是这么做的一定行
 
我在各个地方截获均不成功,请各位大侠说的在详细些
 
在该字段的onvalidate事件中
try
..
except
..
end;

 
我的表名是动态添加给控件的所以在程序运行前无法得到字段的事件
 
procedure TfrmMain.AppException(Sender: TObject;E: Exception);
Var
strSql,strTime: string;
intLength: integer;
NowTime: TSystemTime;
begin
intLength := Length(E.Message);
strSql := 'select * from error_hint where error=''' + E.Message +'''';
With WzDataModule.goQuery do
begin
Active := False;
SQL.Clear;
SQL.Add(strSql);
Active := True;
FetchAll;
end;
if WzDataModule.goQuery.RecordCount=1 then
begin
strSql := WzDataModule.goQuery.FieldByName('hint').AsString;
ShowMessage(strSql);
end
else
begin
GetSystemTime(NowTime);

strSql := 'insert into error_hint(error,length,remark)';
strSql := strSql + 'Values(''' + E.Message + ''',';
strSql := strSql + IntToStr(intLength) + ','''+ DateToStr(SystemTimeToDateTime(NowTime))+''')';
With WzDataModule.goQuery do
begin
Active := False;
SQL.Clear;
SQL.Add(strSql);
ExecSql;
end;
strSql := '这是一个新异常,系统尚未记录!'+#13+'请记下位置交程序员处理。';
Application.MessageBox(PChar(strSql),'提示信息',1);
end;
WzDataModule.goQuery.Close;
WzDataModule.goQuery.SQL.Clear;
end;

然后在主form.OnCreate 中
Application.OnException := TfrmMain.AppException
其它同我上面的回答
 
谢谢诸位的鼎立襄助:
但......
我对e.message有些不理解
 
1。在Form的Public增加以下的代码
public
{ Public declarations }
procedure MyExceptionHandler(Sender : TObject; E : Exception );
end;
2。在Form的implementation部分定义“异常处理”过程
procedure TForm1.MyExceptionHandler(Sender : TObject; E : Exception );
var
wRetVal : Word;
begin
//E.Message中包含真正的错误信息
wRetVal := MessageDlg('ERROR: ' + E.Message,
mtError,
mbAbortRetryIgnore,
0
);

case wRetVal of
mrAbort:
begin
//处理“异常”
end;
mrRetry:
begin
//处理“重试”
end;
mrIgnore:
begin
//处理“取消”
end;
else begin
//其他选择的处理
end;
end;

//也可以在这里调用缺省的“异常处理”
//Application.ShowException( E );
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部