请看以下代码
try
if not VarIsNull(CustVar) then
CustVar := DataSetProvider1.ApplyUpdates(CustVar,0,ErrCount);
except
//showmessage('Error');
on E: Exception do
raise Exception.Create(HandleError(E));//SmDataModule.GetErrorInfo(E));
end;此段代码用TDataSetProvider的ApplyUpdate方法来进行数据的更新,可是如果输入的数据错误,导致数据库报错,我用try..except截获它,并且将此错误抛出,由客户端截获此错误,并显示,可无论我怎样输错数据except...之中的代码就不执行,但是我调试时程序执行到这一段 Custvar := DataSetProvider.ApplyUpdate()就报错,不知道为什么?
请高手帮忙解决;
注:
function HandleError(E);的代码如下
if not (E is EDBEngineError) then
begin
ADOErrors := ADOConnection.Errors;
for i := 0 to ADOErrors.Count - 1 do
begin
ADOError := ADOErrors.Item[i];
Result := ADOError.Description;
end;
end;
为截获ADO的错误,因为我的DataSetProvider的DataSet为ADO。
上面的错误跟HandleError无关,主要的问题是明明有错误发生Except中的代码却不执行>??????下面我会将我的整个程序的处理过程跟大家解释一下,我不想在DataSetProvider的OnUpdateError里写东西。
try
if not VarIsNull(CustVar) then
CustVar := DataSetProvider1.ApplyUpdates(CustVar,0,ErrCount);
except
//showmessage('Error');
on E: Exception do
raise Exception.Create(HandleError(E));//SmDataModule.GetErrorInfo(E));
end;此段代码用TDataSetProvider的ApplyUpdate方法来进行数据的更新,可是如果输入的数据错误,导致数据库报错,我用try..except截获它,并且将此错误抛出,由客户端截获此错误,并显示,可无论我怎样输错数据except...之中的代码就不执行,但是我调试时程序执行到这一段 Custvar := DataSetProvider.ApplyUpdate()就报错,不知道为什么?
请高手帮忙解决;
注:
function HandleError(E);的代码如下
if not (E is EDBEngineError) then
begin
ADOErrors := ADOConnection.Errors;
for i := 0 to ADOErrors.Count - 1 do
begin
ADOError := ADOErrors.Item[i];
Result := ADOError.Description;
end;
end;
为截获ADO的错误,因为我的DataSetProvider的DataSet为ADO。
上面的错误跟HandleError无关,主要的问题是明明有错误发生Except中的代码却不执行>??????下面我会将我的整个程序的处理过程跟大家解释一下,我不想在DataSetProvider的OnUpdateError里写东西。
ApplyUpdates(var CurVar: OleVariant;ProviderName: string);
begin
SMDataModule.BeginTrans; //为ADOConnection.BeginTransction,启动ADO的事物处理
try
DoApplyUpdates(CurVar,ProviderName);
SmDataModule.CommitTrans;
except
SmDataModule.RollTrans;
end;
end;
DoApplyUpdate代码如下:
begin
try
if not VarIsNull(CustVar) then
begin
CustVar := DsProvider.ApplyUpdates(CustVar,0,ErrCount);
if ErrCount > 0 then
SysUtils.Abort;
end;
except
on E: exception do
raise Exception.Create(SmDataModule.GetErrorInfo(E));//抛出异常,由客户端调用ApplyUpdate时,可以截获
end;
end;
SmDataModule.GetErrorInfo(E)代码如下: //为截获ADO的错误,
var
ADOErrors: Errors;
ADOError: Error;
i: integer;
begin
if not (E is EDBEngineError) then
begin
ADOErrors := ADOConnection.Errors;
for i := 0 to ADOErrors.Count - 1 do
begin
ADOError := ADOErrors.Item[i];
Result := ADOError.Description;
end;
end;
end;请问大家觉得这样做,效果怎样???是好还是坏,不过首先希望大家帮我解决错误捕获的问题,,谢谢了,在线等待
begin
SMDataModule.BeginTrans; //为ADOConnection.BeginTransction,启动ADO的事物处理
try
DoApplyUpdates(CurVar,ProviderName); //注意这个地方可能发生异常,在这个地方发生异常以后,将会终止此调用中所有动作,而转到except去执行。也就是,当你的 doapplyUpdates函数中发生异常之后,doapplyupdates函数的所有动作都被终止,那么里面的except当然不被执行!你可以把except修改为finally尝试一下!
SmDataModule.CommitTrans;
except
SmDataModule.RollTrans;
end;
end;
DoApplyUpdate代码如下:
begin
try
if not VarIsNull(CustVar) then
begin
CustVar := DsProvider.ApplyUpdates(CustVar,0,ErrCount);
if ErrCount > 0 then
SysUtils.Abort;
end;
except
on E: exception do
raise Exception.Create(SmDataModule.GetErrorInfo(E));//抛出异常,由客户端调用ApplyUpdate时,可以截获
end;
end;
SmDataModule.GetErrorInfo(E)代码如下: //为截获ADO的错误,
var
ADOErrors: Errors;
ADOError: Error;
i: integer;
begin
if not (E is EDBEngineError) then
begin
ADOErrors := ADOConnection.Errors;
for i := 0 to ADOErrors.Count - 1 do
begin
ADOError := ADOErrors.Item[i];
Result := ADOError.Description;
end;
end;
end;
不过我认为同样的的在事物处理中也应该加这句Raise E;大家可以讨论,我的上面的做法的效率跟可行性了,错误解决了
zhang21cnboy(事了抚衣去,不留身与名) (
你的解释是对的,再进行事物处理的时候把以前的错误抛弃了,所以我再那边加了一句话
....
except
Rollbacks;
raisel;
end;