You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi的ClientDataSet的ReconcileError中抛出异常

Delphi ClientDataSet 更新异常处理解决方案

问题根源

  1. 原代码中Exception.Create(e.Message)仅创建异常对象但未抛出,因此无任何异常提示效果。
  2. 修改为raise Exception.Create(e.Message)后,close;仍执行,是因为调用ApplyUpdates的代码未捕获异常,Delphi默认处理完异常后会继续执行后续代码。

解决方法

方法一:通过异常捕获阻止窗体关闭

1. 修正ReconcileError事件代码

procedure TDataModuleBase.ClientDataSetEntityReconcileError(
  DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind;
  var Action: TReconcileAction);
begin
  if UpdateKind = ukDelete then
  begin
    // 删除失败时恢复记录
    Action := raCancel;
  end
  else
  begin
    // 终止更新并保持数据集编辑状态
    Action := raAbort;
    DataSet.Edit;
  end;

  // 抛出异常,传递到调用层
  raise Exception.CreateFmt('更新失败:%s', [E.Message]);
end;

2. 修改保存按钮代码(添加异常捕获)

try
  ggDataModule.ClientDataSetEntity.ApplyUpdates(0);
  // 更新成功才关闭窗体
  Close;
except
  on E: Exception do
  begin
    ShowMessage(E.Message);
    // 可选:添加错误定位逻辑,比如将焦点移至错误字段
  end;
end;

方法二:通过ApplyUpdates返回值判断(无异常抛出)

1. 修正ReconcileError事件代码(记录错误)

在数据模块中添加一个私有字段FLastErrorMsg: string;用于存储错误信息:

procedure TDataModuleBase.ClientDataSetEntityReconcileError(
  DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind;
  var Action: TReconcileAction);
begin
  if UpdateKind = ukDelete then
  begin
    Action := raCancel;
  end
  else
  begin
    Action := raAbort;
    DataSet.Edit;
  end;

  // 记录错误信息
  FLastErrorMsg := E.Message;
end;

2. 修改保存按钮代码(根据返回值判断)

var
  ErrorCount: Integer;
begin
  ErrorCount := ggDataModule.ClientDataSetEntity.ApplyUpdates(0);
  if ErrorCount > 0 then
  begin
    ShowMessage('更新失败:' + ggDataModule.FLastErrorMsg);
    // 更新失败,不关闭窗体
  end
  else
  begin
    // 更新成功,关闭窗体
    Close;
  end;
end;

说明

  • 方法一利用异常传递机制,在更新失败时直接中断流程,适合需要严格阻断后续操作的场景。
  • 方法二通过ApplyUpdates的返回值(未解决的错误数)判断更新结果,更灵活,避免了异常抛出的开销。

内容的提问来源于stack exchange,提问作者GuidoG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:35:12