【问题标题】:How to suppress exception message box EIdConnClosedGracefully from thread in DataSnap如何从 DataSnap 中的线程中抑制异常消息框 EIdConnClosedGracefully
【发布时间】:2013-01-14 09:35:25
【问题描述】:
【问题讨论】:
标签:
c++builder
indy
datasnap
【解决方案1】:
您是仅在调试器内运行应用程序时才看到消息框,还是在 IDE 外部运行应用程序时也看到消息框?调试器内部是正常行为,因为它们毕竟是异常。除非您告诉它忽略它们,否则调试器会显示引发异常的弹出消息。但是在 IDE 之外,您可以从工作线程中看到消息框的唯一方法是您自己的代码是否正在捕获异常并自己显示消息框,或者 DataSnap 在内部显示它们。 EIdConnClosedGracefully 是一个 Indy 异常,DataSnap 确实在内部使用 Indy,但 DataSnap 不太可能显示自己的消息框。 Indy 肯定不会显示消息框。
【解决方案2】:
我也在 IDE 之外看到了消息框。它来自 TWebRequestHandler (DataSnap)。这是显示该消息框的线程的堆栈跟踪:
:7c90e514 ntdll.KiFastSystemCallRet
:7e369418 user32.WaitMessage + 0xc
:7e3749c4 ; C:\WINDOWS\system32\user32.dll
:7e38a956 ; C:\WINDOWS\system32\user32.dll
:7e38a2bc ; C:\WINDOWS\system32\user32.dll
:7e3b63fd user32.MessageBoxTimeoutW + 0x7a
:7e3a0853 user32.MessageBoxExW + 0x1b
:7e3b6579 user32.MessageBoxW + 0x45
:004D6BBD Sysutils::ShowException(ExceptObject=????, ExceptAddr=????)
:0082b248 ; Webreq::TWebRequestHandler::HandleException
:0082b06f ; Webreq::TWebRequestHandler::HandleRequest
:0043dbdf ; Idhttpwebbrokerbridge::_16464
:0043dd23 Idhttpwebbrokerbridge::TIdHTTPWebBrokerBridge::DoCommandGet + 0x23
:0068AB4D Idcustomhttpserver::TIdCustomHTTPServer::DoExecute(Self=:00E9B9D0, AContext=:00F13660)
:0063F09A Idcontext::TIdContext::Run(Self=????)
:0049F9CD Classes::ThreadProc(Thread=:00ECA260)
:004EF72E System::ThreadWrapper(Parameter=:00F1EF10)
:7c80b729 ; C:\WINDOWS\system32\kernel32.dll
【讨论】:
-
那么这是TWebRequestHandler::HandleException() 中的一个错误,因为它不应该在工作线程内调用ShowException()。请file a bug reportEmbarcadero。