Tl; Dr:使用可能な方法で実装されていません(ベルリン10.1)。
私は同じ問題を遭遇し、多くの情報源から読んだ後、実用的な解決策は見つけられませんでした。
だから、模範的な(私の)スタックトレースに次のようになります。
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
に追加されます。
- さらに下へ
Message
はJSON/DBXコマンドとして出力に書き込まれます。
だから我々はException
オブジェクトを処理していないとStackTrace
または他の情報にアクセスすることができません。したがって、これだけでは受け入れられず、変更する必要があります
良いニュースは、この手順はvirtual
であり、上書きできるということです。悪いニュースは、あなたの上記の例ではそれは、(あなたのErrorHandlerを含む)、独自のProcessRequest
手順で自分のDoDSRESTCommand
とTDSRESTServer
(そこにTDSRESTService
がものすごい大の手順で作成された)とTDSRESTWebDispatcher
をTDSRESTService
を延長しなければならない、である(に応じて、お使いの使用法)。
個人的には、DataSnapを使用しないことをお勧めします。
注:これを書いている時点で、OnError
イベントの呼び出しは見つかりませんでした。
関連(Java用):[JavaサーブレットWebアプリケーションで捕捉されない例外を取得する方法](http://stackoverflow.com/questions/7410414/how-to-grab-uncaught-exceptions-in-a-java -servlet-web-application)同様の解決策が可能かもしれません。 (Datasnapにグローバルリクエストフィルタメカニズムがある場合) – mjn