【发布时间】:2015-12-01 10:31:56
【问题描述】:
我在我的 Datasnap REST 服务(Delphi XE3 但也尝试使用 Delphi 10 Seattle)中的异常处理方面苦苦挣扎。这些年来,我编写了六个 Windows 服务,并且总是包含一个 TApplicationEvents 组件,以便我可以将任何应用程序异常记录到 Windows 事件日志中。
但是,Datasnap 服务不会发生这种行为。 TApplicationEvents.OnException 事件永远不会被触发,所以我假设其他东西正在吃掉异常并在它到达之前处理它。
异常显示在 Web 服务方法的结果中,这很好,因为这意味着我至少可以在客户端显示一些东西,但我也想在那之前捕获它,以便我能够处理服务器端的不同异常。
到目前为止,我管理的唯一一致方法是将每个单独的方法包装在 try..except 块中,并在重新引发异常之前处理每个方法中的异常。然而,随着 20 种方法的 Web 服务不断增长,这并不会真正扩大规模。
我也尝试过实现一些 Datasnap 组件(TDSServer、TDSHTTPService、TDSTCPServerTransport 等)的 OnError、OnTrace 和其他事件,但这些似乎也从未被触发。
请问有人遇到过这种情况吗?
【问题讨论】:
-
Related (for Java): How to grab uncaught exceptions in a Java servlet web application 也许类似的解决方案是可能的。 (如果Datasnap中有全局请求过滤机制)
-
如您所述,DataSnap 事件处理程序代码正在捕获异常。在编写其余代码之前,创建一个模板异常处理程序以放入每个新的事件处理程序很容易。根据您正在做什么,您可能希望在不同的资源请求中做出不同的响应。你当然知道这一切。作为替代方案,您可以只使用默认处理程序并自己解析路径信息,而不是创建不同的操作和事件处理程序,并且在该事件中只使用一个带有异常处理程序的事件处理程序。
标签: delphi delphi-xe3 datasnap