【发布时间】:2018-12-12 14:53:05
【问题描述】:
我有带有 TIBQUery-TDataSetProvider-TClientDataSet 的 Delphi 应用程序,它或多或少地模拟了 CachedUpdates 模式(在之前的 BDE 组件中)。目前没有错误处理代码,因此根本没有错误消息。我只想启用以下场景:当查询遇到来自数据库的任何错误时,所有链应该停止工作,保持在当前值,回滚已经发布的更改并显示消息。我猜——所有这些都可以通过实现 TDataSetProvider.OnUpdateError 来完成。我有 2 个代码提案。第一个:
procedure TBillDM.BillProvUpdateError(Sender: TObject;
DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
var Response: TResolverResponse);
begin
inherited;
raise E;
end;
另一种变体:
procedure TBillDM.BillProvUpdateError(Sender: TObject;
DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
var Response: TResolverResponse);
begin
inherited;
Response:=rrAbort;
BillQry.Transaction.RollbackRetaining;
ShowMessage(E.Message);
end;
这些代码模式是否合理?如果只想停止执行并报告错误,OnUpdateError 的指导方针是什么?我希望应用程序中的零智能 - 我只能提供更有意义的错误消息,但所有更正都应由用户完成。
【问题讨论】:
-
您是否尝试过处理
TIBUpdateErrorEvent并指定uaAbort或uaFail的UpdateAction? -
只要抛出一个异常。这是一种常见的模式,RTL 甚至具有抛出“静默”异常的 abort 方法。它会破坏流动。简单的出路,也可用于没有其他救助方式的事件。
-
不要抛出异常。将异常用于控制流被认为是不好的做法。非必要时不要抛出异常,并尽快捕获其他异常并将其转换为正常的应用程序流程。在这种情况下,请将解析器响应设置为指示您不想继续。
-
听 Golez,而不是 Golez!
标签: delphi error-handling tclientdataset tdatasetprovider