我正在努力处理 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/