Delphi Datasnap REST Server中的异常处理

Delphi Datasnap REST Server中的异常处理,第1张

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

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

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

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

我也尝试过实现一些Datasnap组件的OnError,OnTrace和其他事件(TDSServer,TDShttpService,TDSTcpserverTransport等),但这些事件似乎也从未被解雇过.

有没有人遇到这样的事,拜托?

解决方法 Tl; Dr:它没有以可用的方式实现(在柏林10.1).

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

所以示例(我的)StackTrace看起来像这样:

MyClass::MyServerMethod()/* skipPing some funny unimportant RTTI/TValue handling here */System::Rtti::TRttiMethod::InvokeDsreflect::TDSMethod::Invoke(TObject,TDSMethodValues)TDSServerConnectionHandler::DbxExecute(const TDBXExecuteMessage)TDSServerCommand::DerivedExecuteUpdateTExecuteCallbackTDSService::Execute(const string,const TRequestCommandHandler,TExecuteCallback)TDSService::ProcessRequest(const string,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中引发的每个异常都将以TDSService :: ProcessRequest结束.
>在此过程中,捕获每个异常,并且仅将其消息添加到TRequestCommandHandler-> CommandList.
>此外,Message将作为JsON / DBX命令写入输出.

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

好消息是,这个程序是虚拟的,可以被覆盖.坏消息是,在上面的示例中,您必须使用自己的ProcessRequest过程(包括错误处理程序)扩展TDSRESTService,使用自己的DoDSrestcommand扩展TDSRESTServer(在那里TDSRESTService是在一个极大的过程中创建的)和TDSRESTWebdispatcher(取决于您的用法).

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

注意:在编写本文时,我没有找到任何OnError事件的调用.

总结

以上是内存溢出为你收集整理的Delphi Datasnap REST Server中的异常处理全部内容,希望文章能够帮你解决Delphi Datasnap REST Server中的异常处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1271510.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存