delphi - Delphi Datasnap REST 服务器中的异常处理

标签 delphi delphi-xe3 datasnap

我正在努力处理 Datasnap REST 服务中的异常处理(Delphi XE3,但也尝试过 Delphi 10 Seattle)。多年来我已经编写了六个 Windows 服务,并且我总是包含一个 TApplicationEvents 组件,以便我可以将任何应用程序异常记录到 Windows 事件日志中。

但是,Datasnap 服务不会发生此行为。 TApplicationEvents.OnException 事件永远不会被触发,因此我假设其他东西正在处理异常并在它到达这里之前对其进行处理。

异常显示在 Web 服务方法的结果中,这很好,因为这意味着我至少可以在客户端显示一些内容,但我也想在此之前捕获它,以便我能够处理服务器端有不同的异常。

到目前为止,我管理的唯一一致的方法是将每个单独的方法包装在 try..except block 中,并在重新引发异常之前处理每个方法中的异常。然而,随着 Web 服务包含 20 个方法并且还在不断增长,这并不能真正扩大规模。

我还尝试实现一些 Datasnap 组件(TDSServer、TDSHTTPService、TDSTCPServerTransport 等)的 OnError、OnTrace 和其他事件,但这些事件似乎也从未被触发。

请问有人遇到过这样的事情吗?

最佳答案

Tl;Dr:它没有以可用的方式实现(在 10.1 Berlin)。

我遇到了同样的问题,在阅读了大量资料后,我没有找到实际的解决方案。

因此,示例性(我的)StackTrace 如下所示:

MyClass::MyServerMethod()
/* skipping some funny unimportant RTTI/TValue handling here */
System::Rtti::TRttiMethod::Invoke
Dsreflect::TDSMethod::Invoke(TObject, TDSMethodValues)
TDSServerConnectionHandler::DbxExecute(const TDBXExecuteMessage)
TDSServerCommand::DerivedExecuteUpdate
TExecuteCallback
TDSService::Execute(const string, const TRequestCommandHandler, TExecuteCallback)
TDSService::ProcessRequest(const string, const TRequestCommandHandler, TExecuteCallback)
TDSRESTService::ProcessREST(const string, const string, const TArray<Byte>, const TRequestCommandHandler)
TDSRESTService::ProcessGETRequest(const string, TStrings, TArray<Byte>, TRequestCommandHandler)
TDSRESTServer::DoDSRESTCommand(TDSHTTPRequest, TDSHTTPResponse, string)
TDSRESTServer::DoCommand(TDSHTTPContext, TDSHTTPRequest, TDSHTTPResponse)
Dshttpwebbroker::TDSRESTWebDispatcher::DispatchRequest(TObject, Web::Httpapp::TWebRequest, Web::Httpapp::TWebResponse)

注意:这完全取决于您对 DataSnap 的使用情况。在上述情况下,请求通过 TDSRESTWebDispatcher(来自 TIdCustomHTTPServer)传递到 DataSnap API。

  • ServerMethod 中引发的每个 Exception 都将最终出现在 TDSService::ProcessRequest 中。
  • 在此过程中,每个 Exception 都会被捕获,并且仅将其 Message 添加到 TRequestCommandHandler->CommandList 中。
  • 接下来,消息将作为 JSON/DBX 命令写入输出。

因此我们永远无法处理Exception对象并访问StackTrace或其他信息。所以仅这一点是 Not Acceptable ,必须改变

好消息是,这个过程是虚拟并且可以被覆盖。坏消息是,在上面的示例中,您必须使用自己的 ProcessRequest 过程(包括错误处理程序)扩展 TDSRESTService,使用 TDSRESTServer 扩展自己的 DoDSRESTCommand (其中 TDSRESTService 是在一个巨大的过程中创建的)和 TDSRESTWebDispatcher (取决于您的使用情况)。

我个人的建议是不要使用 DataSnap。

注意:在撰写本文时,我尚未发现任何 OnError 事件的调用。

关于delphi - Delphi Datasnap REST 服务器中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018177/

相关文章:

delphi - 安装自定义软件包后如何修复损坏的 Delpi XE3 IDE?

delphi - 无法从 Datasnap 服务器检索大于约 260.000 字节的 TStream

delphi - 使用 FireDac (Delphi) 在 Firebird 中创建数据库

android - 如何使图像的一部分透明?

delphi - 用于输入一系列值的组件(类似于轨迹栏)

ios - 德尔福 Firemonkey IOS TContextOpenGL.DestroyPixelShader EXC_BAD_ACCESS

delphi - 如何在 DataSnap 中的 JSON 编码中跳过字段序列化?

delphi - 停止 kernell32 事件

delphi - 最小化 Firemonkey 应用程序中的表单

multithreading - Delphi图像处理同步线程