सवाल आंतरिक अपवाद की जांच करने का सबसे अच्छा तरीका?


मुझे पता है कि कभी-कभी आंतरिक अपवाद शून्य है

तो निम्नलिखित विफल हो सकता है:

 repEvent.InnerException = ex.InnerException.Message; 

क्या आंतरिक अपवाद शून्य है या नहीं, यह जांचने के लिए एक त्वरित टर्नरी तरीका है?


50
2017-09-21 20:08


मूल


आप अपने स्वीकृत उत्तर पर फिर से विचार करना चाहेंगे। जिस्टिस्ट का जवाब दूसरों की तुलना में बेहतर है, क्योंकि इनरएक्सप्शन में अपना स्वयं का इंजेक्शन अपवाद हो सकता है। - Ryan Lundy
ध्यान रखें कि ToString आंतरिक अपवादों के माध्यम से चलता है और उन्हें आपके लिए जोड़ता है। लॉगिंग करते समय यह एक आसान शॉर्ट-कट हो सकता है। - Steven Sudit


जवाब:


क्या यह वही है आप जिसकी तलाश में हैं?

String innerMessage = (ex.InnerException != null) 
                      ? ex.InnerException.Message
                      : "";

51
2017-09-21 20:09



साथ ही, क्या यह सिर्फ मुझे है, या अगर तर्क फिसल गया था और यह थोड़ा क्लीनर दिखता है != में परिवर्तित किया गया ==। - Noldorin
@ नोल्डोरिन - क्षमा करें दोस्त, मैंने इसका उत्तर दिया और यह देखने के लिए जांच नहीं की कि मैं पहले था या नहीं! @ जेएल - नॉल्डोरिन सही जवाब के साथ चुटकी का पहला आउट था, कृपया उसे स्वीकार किए गए उत्तर को स्थानांतरित करें। - Andrew Hare
@ एंड्रयू: हे, क्षमा मांगने की कोई ज़रूरत नहीं है। :) मैं एक मामूली मामला के मुद्दे पर परेशान नहीं हूं, मैं मुख्य रूप से जेएल के कारण के रूप में उत्सुक था। - Noldorin
काम करता है लेकिन एकाधिक नेस्टेड अपवादों के लिए नहीं - krystan honour


अब तक महान जवाब। इसी तरह, लेकिन अलग-अलग नोट पर, कभी-कभी घोंसला वाले अपवादों के एक से अधिक स्तर होते हैं। यदि आप रूट अपवाद को मूल रूप से फेंकना चाहते हैं, चाहे कितना गहरा हो, आप इसे आजमा सकते हैं:

public static class ExceptionExtensions
{
    public static Exception GetOriginalException(this Exception ex)
    {
        if (ex.InnerException == null) return ex;

        return ex.InnerException.GetOriginalException();
    }
}

और उपयोग में:

repEvent.InnerException = ex.GetOriginalException();

75
2017-09-21 20:16



क्या मुझे यहां कुछ याद आ रहा है या ex.GetOriginalException () आंतरिक अपवाद के लिए शीर्ष स्तर पूर्व नहीं है? - JL.
मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। GetOriginalException उस मूल अपवाद को वापस कर देगा जिसने पूरी अपवाद श्रृंखला शुरू की है, इस पर ध्यान दिए बिना कि केवल एक अपवाद है (कोई भी अंदरूनी अपवाद नहीं है), या इनर एक्सेप्शन के कई स्तर हैं। - jrista
धन्यवाद, इससे मुझे EntityFramework द्वारा फेंक दिया गया अपवाद का आंतरिक पता लगाने में मदद मिली। - Blake Mumford
मुझे यकीन नहीं है कि नेट फ्रेमवर्क का कौन सा संस्करण GetOriginalException प्रदान करता है, लेकिन मैं देख सकता हूं कि GetBaseException () है। क्या वही है? - Antony
वह कह रहा है कि आपको GetOriginalException नामक अपनी विधि को लागू करना चाहिए। लेकिन हाँ, ऐसा लगता है कि GetBaseException () एक ही चीज़ करता है। - Justin T Conroy


यह मजाकिया है, मुझे कुछ भी गलत नहीं मिल रहा है Exception.GetBaseException ()?

repEvent.InnerException = ex.GetBaseException().Message;

36
2017-09-21 21:19



बढ़िया !, इसके साथ आपको सभी नेस्टेड अपवादों के माध्यम से नेविगेट करने के लिए एक कस्टम विधि नहीं करना है। - armadillo.mx
मेरे पास अभी एक उदाहरण था जहां मैंने HttpClient के लिए कार्य <स्ट्रिंग> के लिए GetBaseException का उपयोग करने का प्रयास किया था, और यह केवल उच्च स्तरीय अपवाद लौटा रहा था। जब मैंने जिस्टा के समाधान को लागू किया, तो उसने "मशीन सक्रिय रूप से अस्वीकार कर दी .." संदेश जो मैं ढूंढ रहा था। - Dan Chase


सबसे सरल समाधान बुनियादी सशर्त अभिव्यक्ति का उपयोग करना है:

repEvent.InnerException = ex.InnerException == null ? 
    null : ex.InnerException.Message;

16
2017-09-21 20:09



कोई समस्या नहीं, बस एंड्रयू का कोड एक स्ट्रिंग लौटा। - JL.
@ जेएल: वास्तव में, दिमाग एक देता है string भी। मैंने बस उस कोड से लिया जिसे आप बुला रहे थे string संपत्ति InnerException (बस उलझन में हो?)। हालांकि कभी बुरा मत मानो। @ एंड्रयू: धन्यवाद। और यद्यपि मैं बिल्कुल नहीं सोचता, सौजन्य के लिए आपका +1 करता हूं। - Noldorin
@ नॉर्डोरिन, आह मैं देखता हूं कि समस्या कहां आती है, मैं स्ट्रिंग चला गया हूं क्योंकि अपवाद अच्छी तरह से क्रमबद्ध नहीं होते हैं (यदि वे बिल्कुल करते हैं)। - JL.
@ जेएल: एनईटी फ्रेमवर्क के साथ आने वाले अपवाद ठीक से क्रमबद्ध होते हैं, क्योंकि उनमें से सभी को एक deserialization कन्स्ट्रक्टर है। कस्टम अपवाद ठीक से क्रमबद्ध नहीं हो सकते हैं, लेकिन एक deserialization कन्स्ट्रक्टर जोड़ने और GetObjectData ओवरराइड करना काफी आसान है। थर्ड-पार्टी एक्सटेंशन को क्रमबद्ध सरोगेट के साथ क्रमबद्ध किया जा सकता है। - jrista


यह एक पुराना सवाल है लेकिन भविष्य के पाठकों के लिए:

पहले से पोस्ट किए गए उत्तरों के अलावा मुझे लगता है कि ऐसा करने का सही तरीका (जब आप एक से अधिक इंनेरएक्सप्शन ले सकते हैं) है अपवाद। गेटबेस अपवाद विधि

यदि आप अपवाद उदाहरण चाहते हैं तो आपको यह करना चाहिए:

repEvent.InnerException = ex.GetBaseException();

यदि आप केवल इस तरह के संदेश की तलाश में हैं:

repEvent.InnerException = ex.GetBaseException().Message;

10
2018-05-14 20:50





इन उत्तरों में इतनी ज्यादा रिकर्सन क्यों?

public static class ExceptionExtensions
{
    public static Exception GetOriginalException(this Exception ex)
    {
        while(ex.InnerException != null)ex = ex.InnerException;
        return ex;
    }
}

इसे लागू करने के लिए एक और अधिक सीधे आगे की तरह लगता है।


10
2018-05-14 20:57





सी # 6.0 के साथ आप इसका उपयोग कर सकते हैं:

string message = exception.InnerException?.Message ?? "";

कोड की यह पंक्ति इसी प्रकार है:

string message = exception.InnerException == null ? "" : exception.InnerException.Message

https://msdn.microsoft.com/en-us/library/ty67wk28.aspx

http://blogs.msdn.com/b/jerrynixon/archive/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator.aspx


8
2017-10-05 11:19



+1 𝑓𝑜𝑟 शून्य-सशर्त और शून्य-सहकारी ऑपरेटरों। का उपयोग (ex.InnerException?.Message??"") सुविधाजनक, पठनीय और सुरक्षित है। - dakab


कभी-कभी इनरएक्सप्शन में एक आंतरिक अपवाद भी होता है, ताकि आप इसके लिए एक पुनरावर्ती कार्य का उपयोग कर सकें:

public string GetInnerException(Exception ex)
{
     if (ex.InnerException != null)
     {
        return string.Format("{0} > {1} ", ex.InnerException.Message, GetInnerException(ex.InnerException));
     }
   return string.Empty;
}

5
2017-09-21 20:17



मैं सब सबसे पुराना अपवाद खोदने के लिए हूं, लेकिन वास्तव में यहां पर पुनर्विचार करने का कोई कारण नहीं है। आंतरिक अपवाद के दौरान बस लूप शून्य नहीं है। - Steven Sudit
रिकर्सन बुराई या कुछ है? - tster
जैसे इकाई फ्रेमवर्क में उपयोगी रूप से गहरे अंदर अपवाद हैं। - Jan Remunda
रिकर्सन बुरा नहीं है, लेकिन यह महंगा हो सकता है, इसलिए यदि आपको इसकी आवश्यकता नहीं है, तो इसका उपयोग न करें। आंतरिक अपवादों के मामले में, आपको वर्तमान स्थिति को एक ढेर पर धक्का देने की आवश्यकता नहीं है ताकि आप जहां से छोड़े गए हों, जारी रख सकें, तो पुनरावृत्ति का उपयोग क्यों करें और इस कीमत का भुगतान क्यों करें? ऐसे मामले भी हैं जहां रिकर्सन बहुत अधिक है, नियमित पुनरावृत्ति की तुलना में बहुत धीमी है, जैसे कि फाइब श्रृंखला की गणना करना। - Steven Sudit
मिठाई! मैंने इसे परियोजना-व्यापी उपलब्ध कराने के लिए एक विस्तार विधि के रूप में जोड़ा - Korayem