如何跟踪程序运行中的Exception,并根据不同的Exception,屏蔽原有的提示信息,显示自己的提示信息,请指教。(100分)

T

triton

Unregistered / Unconfirmed
GUEST, unregistred user!
如何跟踪程序运行中的Exception,并根据不同的Exception,屏蔽原有的提示信息,显示自己的提示信息,请指教。
 
使用Try语句截获错误,在分析e.message内容,替换成你的信息即可。
 
if (Pos(UpperCase('primary key'),UpperCase(E.Message))>0) then
begin
Application.MessageBox(pchar('没有输入满足要求的ID,请确认!'
),'告警',MB_ICONWARNING);
Exit;
end;
我这样做了可是没用,你能说详细一点吗?
 
我觉得可以响应系统默认异常处理事件。
我是这样处理的。
1、先声明一个这样的function
procedure TMainForm.MyException(Sender: TObject; E: Exception);
var show:string;
begin
try
MShowMessage('系统错误','未处理的错误,请记录下面信息并及时告知系统管理员:'+#13+#13+E.Message,1);
except
show := '未处理的错误,请记录下面信息并及时告知系统管理员:'+#13+#13+E.Message;
ShowMessage(pchar(show));
end;
end;

2、再在主窗体OnCreate事件中添加如下语句
Application.OnException := MyException; //设置系统未处理的异常的处理方法
 
“娃娃”的思路对头,但是在MyException过程的代码处理不是很恰当。可以考虑如下的
异常处理处理代码:
try
...
except
on EZeroDivide do HandleZeroDivide;
on EOverflow do HandleOverflow;
on EMathError do HandleMathError;
end;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, Grids, DBGrids, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
ADODataSet1: TADODataSet;
ADOConnection1: TADOConnection;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure TabSheet1Show(Sender: TObject);
procedure TabSheet1Enter(Sender: TObject);
procedure savetable;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure SqlErrorProc(Sender:TObject;E:Exception);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.TabSheet1Show(Sender: TObject);
begin
tabsheet1.SetFocus;
end;

procedure TForm1.TabSheet1Enter(Sender: TObject);
begin
adodataset1.Active :=false;
adodataset1.CommandText:='Select Id as 序号,ClassName as 种类 from tb_class';
adodataset1.Active:=true;


{combobox1.Clear ;
adodataset1.First ;
while not adodataset1.eof do
begin
combobox1.Items.Add(adodataset1.FieldByName('序号').asstring+':'+
adodataset1.FieldByName('种类').asstring);
adodataset1.Next;
end;
combobox1.ItemIndex :=0;}

end;

procedure TForm1.savetable;
begin

if Application.MessageBox(pchar('您确实需要修改数据库吗?')
,'询问',MB_OKCANCEL)=IDOK then
begin
try
adodataset1.UpdateBatch;
except
Application.MessageBox(pchar('数据库异常操作,请退出后再试!'
),'告警',MB_ICONWARNING);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
adodataset1.Append;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if (adodataset1.recordcount>0)and (adodataset1.recno>=0) then
adodataset1.Delete
else
Application.MessageBox(pchar('数据库异常操作,请退出后再试!'
),'告警',MB_ICONWARNING);

end;

procedure TForm1.Button3Click(Sender: TObject);

begin
savetable;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
adodataset1.UpdateBatch;
end;

procedure TForm1.SqlErrorProc(Sender:TObject;E:Exception);
begin
if (Pos(UpperCase('primary key'),UpperCase(E.Message))>0) then
begin
Application.MessageBox(pchar('没有输入满足要求的ID,请确认!'
),'告警',MB_ICONWARNING);
// Exit;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException:=Form1.SqlErrorProc;

Application.ProcessMessages;
end;
end.
好像不行我的程序运行后,提示“EOleException with message 'Violation of PRIMARY KEY”
请问错在哪里?
 
用TRY ..EXCEPT.. END;
VAR
X,Y:extended;
K:extended;
BEGIN
X:=12.3;
Y:=0.0;
TRY
K:=X/Y; <<-------------try 和 Except中间写要异常保护的语句
EXCEPT
ON EZeroDivide do <<-------------这里写要捕获的异常,可以写多个,但不能有包含关系,最好是不同类型的
Showmessage('您除零了!');
END; <<-------------保护结束
end;

//注意在写异常程序的时候要注意的是有的异常很大
,例如Exception是所有异常的父类,它可以捕获所有的异常问题,如果你想细分
可看SysUtils单元中以E开头的都是异常类
 
你这样其实是把异常细化,我也试过这样,如果这样做的话可能这个
function就要写很多代码了^_^

不过各取所求,我只是希望程序出现一些我没有考虑到的异常时不要
太惨就行了。至于一些能考虑到的异常,我还是主张人性化一点的提
示用户,最好在事件处理过程中加入异常捕捉。
 
你先看清楚我的代码再写,
Application.OnException:=Form1.SqlErrorProc;
后面这个事件SqlErrorProc,是指在程序发生异常
而且你没有用try...except捕捉并处理的情况下,
程序默认的处理方法(比如程序弹出一个对话框,
里面一大推英文就是Delphi的默认处理)。

而你现在这种写法相当于如下的逻辑:
当程序未处理异常发生时-------》检查异常提示中有没有主键这个词
-----》如果有则自行提示.......>"如果没有则默认处理"。

你觉得合不合理呢?正是你的这个逻辑导致程序
最后还是采用了Delphi的默认处理。

如果你想在这个事件中出现人性化一点的提示,你可以试试
WolfXP的方法,在这个事件中捕捉异常类型。再做提示。

 
Wolf 的方法是过了,可是sysutils里面没有EOleException,怎样处理呢?
 
To 娃娃
没有EOleException的处理,所以只能通过查找E.Message了。可是好像没有返回。
 
好像Exception无法截获adodataset.Upbatch,请问怎样截取比较好!
 
你完全可以在你处理Upbatch的地方加一个异常捕捉,然后提示
Upbatch出错就可以了。

我说的这个方法就是做个后备。防止你没有处理到的异常抛出。
 
我这样做可是还是不行
try
adodataset1.UpdateBatch;
except
Application.MessageBox(pchar('没有输入满足要求的ID,请确认!'
),'告警',MB_ICONWARNING);
Exit;
end;
 
你可以在except中放入一下代码即可截获
on e:exception do
begin
end;
 
谢谢MR.ZHANG和各位的帮助
 
顶部