核心提示:如何捕获ClientDataSet.ApplyUpdates的错误,不用ReconcileError...

  1. var
  2. cdsEmp:TClientDataSet;
  3. //保存
  4. procedure TfrmEmp.btnSave(Sender: TObject);
  5. begin
  6. cdsEmp.RemoteServer.AppServer.BegTrans;
  7. try
  8. cdsEmp.ApplyUpdates(0); //更新错误在这一句发生,但是我却永远也捕获不到,
  9. //我想自已在异常处理里显示这里发生的错误信息该怎么办?
  10. cdsQrObj.RemoteServer.AppServer.ComTrans;
  11. except
  12. on E:Exception do
  13. begin
  14. cdsEmp.RemoteServer.AppServer.RobTrans;
  15. Application.MessageBox(pchar('存盘失败!'+#13#10+'错误信息:'+E.Message),'提示',MB_OK+MB_ICONEXCLAMATION);
  16. Abort;
  17. end;
  18. end;
  19. end;
  20. //如果用这个错误处理,我的事务回滚却不知放在何处才妙,并且我不是想用这个错误处理
  21. procedure TfrmEmp.cdsEmpReconcileError(
  22. DataSet: TCustomClientDataSet; E: EReconcileError;
  23. UpdateKind: TUpdateKind; var Action: TReconcileAction);
  24. begin
  25. HandleReconcileError(DataSet, UpdateKind, E);
  26. Action:=raAbort;
  27. end;
  28. 解答一:
  29. //---------------------------------------------------------------
  30. //据我所知,只能用ReconcileError 可以用下面的方法判断是否错误
  31. ...
  32. BeginTransaction;
  33. if cdsMaster.ApplyUpdates(0)+cdsDetail.ApplyUpdates(0)=0 then
  34. CommitTransaction
  35. else
  36. RollbackTransaction;
  37. ApplyUpdates方法返回更新时遇到的错误数量.
  38. ...
  39. //---------------------------------------------------------------
  40.  
  41. 解答二:
  42. //---------------------------------------------------------------
  43. DataSetProvideronUpdateError
  44. raise E;
  45. 然后就可以在客户端的
  46. try
  47. ClientDataSet1.ApplyUpdates(0);
  48. except
  49. on e:Exception do
  50. ...
  51. end;
  52. //----------------------------------------------------------------
  53. 解答三:
  54. 其实真正的捕获ClientDataSet.ApplyUpdate异常的方法应该是在Apllication的异常中捕获并处理它。因为ClientDataSet抛出的异常为线程(进程?)异常,在ClientDataSetApplyUpdate中用try...except...end;是无法捕获的。
  55. 具体方法为:在公共单元如DataModule中放置一个ApplicationEvent件,在该控件的OnException事件中捕获异常,该窗体应在所有有可能产生ApplyUpdateConnection异常的窗体之前创建。
  56. procedure TClient_RDataForm.ApplicationEvents1Exception(Sender: TObject;
  57. E: Exception);
  58. begin
  59. if (E is ESocketConnectionError) or (E is ESocketError) then
  60. begin
  61. if not Is_OK then
  62. begin
  63. Application.MessageBox(PChar('考试应用服务器或网络连接失败!请退出后重新启动考试系统! '),
  64. '服务器连接中断', MB_OK + MB_ICONERROR);
  65. Application.Terminate;
  66. Exit;
  67. end;
  68. while not ReConnect_Srv do //重新连接又失败了
  69. begin
  70. if Application.MessageBox(PChar('考试服务器或网络连接失败!请立即与监考老师联系!  '+#13+'要重新搜索服务器请按[是],强制退出请按[否]! '),
  71. '服务器连接失败', MB_YESNO + MB_ICONSTOP) <> IDYES then
  72. if (Application.MessageBox('真的要强制退出考试系统吗?  ','强制退出确认', MB_YESNO + MB_ICONWARNING + MB_DEFBUTTON2) = IDYES) then
  73. begin
  74. Application.Terminate;
  75. Exit;
  76. end;
  77. end;
  78. if MyConnection.Connected then
  79. begin
  80. Application.MessageBox('考试应用服务器恢复连接成功!','连接成功',MB_OK+MB_ICONINFORMATION);
  81. Exit;
  82. end;
  83. end else
  84. raise Exception.Create('考试系统发生异常错误!退出后请重新启动考试系统继续考试!');
  85. //ShowMessage(e.Message);
  86. end;

捕获ClientDataSet.ApplyUpdates和SocketConnection异常的更多相关文章

  1. 如何捕获 System.loadLibrary 产生的异常?(转)

    如何捕获 System.loadLibrary 产生的异常? 当使用以下代码时,会发现异常处理的代码根本不会被执行: try{ System.loadLibrary("SimpleAuthe ...

  2. Application中捕获APP中的全局异常

    package com.example.administrator.mystudent; import android.app.Application; import android.util.Log ...

  3. 【转】asp.net 利用Global.asax 捕获整个解决方案中的异常错误

    之前做项目的时候都是在每个页面中处理这不同的异常信息,一个页面数下来,很多个try{}catch{}语句块,令整个代码结构有些不够美观. 今天看到一篇帖子,是关于利用全局应用程序类来帮忙获取异常信息, ...

  4. C++ try catch 捕获空指针异常,数组越界异常

    #include <exception> #include <iostream> using namespace std; /************************* ...

  5. 使用domain模块捕获异步回调中的异常

    和其他服务器端语言相比,貌似node.js 对于异常捕捉确实非常困难. 首先你会想到try/catch ,但是在使用过程中我们会发现并没有真正将错误控制在try/catch 语句中. 为什么? 答案是 ...

  6. java主线程捕获子线程中的异常

    本文主要参考:<think in java> 好,下面上货. 正常情况下,如果不做特殊的处理,在主线程中是不能够捕获到子线程中的异常的. 例如下面的情况. package com.xuey ...

  7. java线程基础巩固---如何捕获线程运行期间的异常

    对于友盟统计我想搞程序的应该无人不晓,其中对于里面用得最多的功能就是对线上的崩溃进行修复,而这些异常都是运行期的,如: 其实也就是可以对线程中出现了这种运行期异常是提供有一种捕获机制对其进行统一处理, ...

  8. node.js 使用domain模块捕获异步回调中的异常

    和其他服务器端语言相比,貌似node.js 对于异常捕捉确实非常困难. 首先你会想到try/catch ,但是在使用过程中我们会发现并没有真正将错误控制在try/catch 语句中. 为什么? 答案是 ...

  9. 在Laravel中使用数据库事务以及捕获事务失败后的异常

    Description 在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法.如果在事务的闭包内抛出异常,事务将会被自动还原.如果闭包运 ...

随机推荐

  1. WebView的应用 持续积累

    在我的项目中载入网页时我们会用到WebView这个控件,关于这个控件的相关的比較有用的API在这里记录一下. 第一 webview 设置javascript可用,  mWebView = (WebVi ...

  2. linux vi 撤销重做于前进后退--转

    在vi中按u可以撤销一次操作 u   撤销上一步的操作Ctrl+r 恢复上一步被撤销的操作 注意:如果你输入“u”两次,你的文本恢复原样,那应该是你的Vim被配置在Vi兼容模式了.重做如果你撤销得太多 ...

  3. Android(java)学习笔记134:Handler用法总结 和 秒表案例

    一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...

  4. 比较js中创建对象的几种方式

    1.工厂模式 function createObj(name, sex){ var obj = new Object(); obj.name = name; obj.sex = sex; obj.sa ...

  5. Objective-C,复合类,Composition

     复合类 5.复合类现实中,复杂的对象都是由较小和较为简单的对象构成:由简单对象创建复杂对象的过程称作合成.合成通常使用在有has-a关系的对象:通常的基本数据类型可以满足构造简单和小的对象.为了从小 ...

  6. 关于SWT/JFace的事件模型的四种方式

    事件的4种写法 1.匿名内部类方式的写法 2.命名内部类的写法 3.外部类写法 4.实现监听接口的写法 第一种用匿名内部类的方法: public class HelloWorld { private ...

  7. C语言的一些误用和知识总结

    现在学嵌入式的话,最主要是要把C语言熟悉,比如指针,链表,共用体,结构体等,还是得听老师的话.. 在学习单片机的时候才真正知道C语言是什么它是来干什么的~但是C语言用到嵌入式只是它小小的一部分他的应用 ...

  8. Android开发学习

    Android Studio中文社区:http://www.android-studio.org/ Android Studio官方网站地址:http://developer.android.com/ ...

  9. yii2 ./yii command : No such file or directory

    git clone下来的yii2后台项目,由于需要执行 ./yii migrate命令.执行之后,提示 No such file or directory 我从同样为yii2 basic的./yii ...

  10. c#通过Dotpeek调试dll

    我想编程的兄弟们都要引用别人代码,哪怕是.framework里面的基础类库,也经常引用别人的一些dll,但是别人内部抛出一些异常的时候,又不知道到底怎么回事,如果这时候可以在别人的代码里面调试该多好呀 ...