2015-12-01 8 views
5

में अपवाद हैंडलिंग मैं अपने डेटासैप आरईएसटी सेवा (डेल्फी एक्सई 3 के साथ अपवाद प्रबंधन के साथ संघर्ष कर रहा हूं लेकिन डेल्फी 10 सिएटल के साथ भी कोशिश की)। मैंने पिछले कुछ वर्षों में आधा दर्जन विंडोज सेवा लिखी है और मैं हमेशा एक TApplicationEvents घटक शामिल करता हूं ताकि मैं विंडोज इवेंट लॉग में किसी भी एप्लिकेशन अपवाद को लॉग कर सकूं।डेल्फी डेटासैप आरईएसटी सर्वर

हालांकि, यह व्यवहार डेटासेट सेवा के साथ नहीं हो रहा है। TApplicationEvents.OnException ईवेंट कभी नहीं निकाल दिया जाता है, इसलिए मुझे लगता है कि कुछ और अपवाद खा रहा है और इसे यहां आने से पहले इसे संभाला जा रहा है।

अपवाद वेब सेवा विधि के परिणाम में प्रदर्शित होता है, जो ठीक है क्योंकि इसका मतलब है कि मैं कम से कम क्लाइंट पक्ष पर कुछ प्रदर्शित कर सकता हूं, लेकिन मैं इससे पहले भी इसे पकड़ना चाहता हूं ताकि मैं सक्षम हो सकूं विभिन्न अपवाद सर्वर-पक्ष संभाल लें।

मैंने अभी तक प्रबंधित किया है एकमात्र लगातार तरीका try..except ब्लॉक में प्रत्येक व्यक्तिगत विधि को लपेटना है, और अपवाद को फिर से उठाने से पहले प्रत्येक विधि में अपवाद को संभालना है। हालांकि, 20 विधियों और बढ़ती वेब सेवा के साथ, यह वास्तव में बढ़ने वाला नहीं है।

मैंने ऑनर्रॉयर, ऑनट्रेस और कुछ डेटासेट घटक (टीडीएसएस सर्वर, टीडीएसएचटीटीपीएस सेवा, टीडीएसटीसीपीएस सर्वर ट्रान्सपोर्ट इत्यादि) की अन्य घटनाओं को लागू करने का भी प्रयास किया है, लेकिन इन्हें कभी भी निकाल दिया नहीं जाता है।

क्या कोई इस तरह से कुछ भी आया है, कृपया?

+0

संबंधित (जावा के लिए): [जावा सर्वलेट वेब एप्लिकेशन में बेजोड़ अपवाद कैसे प्राप्त करें] (http://stackoverflow.com/questions/7410414/how-to-grab-uncaught-exceptions-in-a-java -सर्वलेट-वेब-एप्लिकेशन) शायद एक समान समाधान संभव है। (यदि डेटासेट में वैश्विक अनुरोध फ़िल्टर तंत्र है) – mjn

उत्तर

0

टीएल; डॉ: यह एक उपयोगी फैशन (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 है और इसे ओवरराइट किया जा सकता है। (के आधार पर बुरी खबर यह है कि आप ऊपर के उदाहरण में (अपने errorhandler सहित) अपनी खुद की ProcessRequest प्रक्रिया के साथ TDSRESTService विस्तार करने के लिए, खुद DoDSRESTCommand साथ TDSRESTServer (वहाँ में TDSRESTService एक विकराल रुप में बड़ी प्रक्रिया में बन जाता है) और TDSRESTWebDispatcher होता अपने उपयोग)।

मेरी निजी सिफारिश डेटास्नाप का उपयोग नहीं करना है।

नोट: इसे लिखने के बिंदु पर, मुझे OnError ईवेंट का कोई आविष्कार नहीं मिला है।

संबंधित मुद्दे