Delphi Datasnap REST Server中的异常处理

时间:2015-12-01 10:31:56

标签: delphi delphi-xe3 datasnap

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

但是,Datasnap Service不会发生此行为。 TApplicationEvents.OnException事件永远不会被触发,所以我假设其他东西正在吃异常并在它到达之前处理它。

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

到目前为止我唯一一致的方法是将每个单独的方法包装在try..except块中,并在重新引发异常之前处理每个方法中的异常。但是,随着20种方法的Web服务不断增长,这种情况并没有真正扩大。

我也尝试过实现一些Datasnap组件的OnError,OnTrace和其他事件(TDSServer,TDSHTTPService,TDSTCPServerTransport等),但这些事件似乎也没有被解雇。

有人遇到过这样的事吗?

1 个答案:

答案 0 :(得分:0)

Tl; Dr:它没有以可用的方式实施(在柏林10.1)。

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

所以示例(我的)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。

  • Exception中提出的每个ServerMethod都会以TDSService::ProcessRequest结尾。
  • 在此过程中,每个Exception都会被捕获,只有Message被添加到TRequestCommandHandler->CommandList
  • 再往下Message被写为输出的JSON / DBX命令。

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

好消息是,此程序为virtual并且可以被覆盖。坏消息是,在上面的示例中,您必须使用自己的TDSRESTService程序(包括您的错误处理程序),ProcessRequest使用自己的TDSRESTServer扩展DoDSRESTCommand(在那里) TDSRESTService是在一个极大的程序中创建的)和TDSRESTWebDispatcher(取决于您的用法)。

我个人建议不要使用DataSnap。

注意:在写这篇文章时,我还没有找到OnError事件的任何调用。