2008-12-03 19 views
9

एक webservice में मुझे यह कोड दिखाई देता है:इसे फिर से फेंकने के लिए अपवाद क्यों पकड़ें?

<WebMethod()> _ 
Public Function dosomething() As Boolean 
    Try 
     If successful Then 
      Return True 
     Else 
      Return False 
     End If 
    Catch ex As Exception 
     Throw ex 
    End Try 
End Function 

अपवाद को पकड़ने और इसे फिर से फेंकने का क्या मतलब है? क्या मुझे कुछ याद आती है?

संपादित करें: उत्तर के लिए धन्यवाद! मैंने सोचा कि यह ऐसा कुछ था, लेकिन मुझे यकीन नहीं था कि अगर मैं बिना किसी प्रभाव के उन लोगों को दोबारा कर सकता/सकती हूं।

उत्तर

11

मैं कार्यक्षमता के लिए ऐसा करने का कोई कारण नहीं सोच सकता। हालांकि, यह तब उत्पन्न हो सकता है जब पहले कुछ त्रुटि प्रबंधन (आमतौर पर लॉगिंग) हटा दिया गया था, और डेवलपर ने लॉग हैंडलिंग को हटा दिया लेकिन अनावश्यक प्रयास/पकड़ को हटाने के लिए कोड को पुन: स्थापित नहीं किया।

5

शायद डिबगिंग से कुछ कोड छोड़ दिया गया है (आप फेंकने पर ब्रेकपॉइंट सेट करेंगे ताकि आप डीबगर में अपवाद की जांच कर सकें)। अगर मैं अपवाद लॉग करना चाहता था और फिर इसे श्रृंखला को पास करना चाहता था, तो मैं ऐसा कुछ कर सकता हूं, हालांकि मैं शायद किसी अन्य में अपवाद को अधिक अर्थपूर्ण (मेरे आवेदन के लिए) त्रुटि संदेश के साथ लपेटूंगा।

40

ऐसा मत करें।

यदि आपको बिल्कुल अपवाद को फिर से निकालना है, तो throw; का उपयोग throw ex; का उपयोग करके स्टैक ट्रेस मिटा देता है और बिल्कुल गलत है।

+0

कौन सा एक और कारण है कि मैं एक आंतरिक अपवाद के रूप में लपेट अगर मैं प्रवेश के लिए ऐसा करने के लिए आवश्यक होता है कहा जाता है। – tvanfosson

+0

क्यों? बस मूल अपवाद फेंक दें। लॉगिंग को कुछ भी बदलना या बदलना नहीं चाहिए। – GEOCHET

+3

अपवाद में अपना स्वयं का अर्थशास्त्र जोड़ने के लिए। पूर्व।मुझे एक SqlException मिलता है क्योंकि मैं एक डुप्लिकेट प्राथमिक कुंजी के साथ एक पंक्ति डालने का प्रयास करता हूं। मेरी विधि में मुझे पता है कि किस प्रकार की वस्तु और किस महत्वपूर्ण मूल्य को डाला जा रहा है। मैं एक बेहतर अपवाद संदेश लिख सकता हूं फिर भी सभी जानकारी बरकरार रखता हूं। – tvanfosson

-8

यदि आप इसे उप-वर्ग को छोड़कर अपवाद पकड़ना चाहते हैं तो आप इसे करना चाहेंगे।

उदाहरण के लिए

,

try { 
    // Something stupid 
} 
catch(RuntimeException e) { 
    throw e; //Handle it outside 
} 
catch (Exception e) { 
    // I'm dead 
} 
+2

लेकिन आप अभी भी "फेंक ई" को कॉल नहीं करना चाहते हैं। आप इसके बजाए "फेंकना" चाहते हैं। कॉलिंग "फेंक ई" उस बिंदु तक स्टैक जानकारी को छोड़ देता है, और यह खतरनाक है। –

+2

गलत गलत गलत। कृपया इसे लोगों को न कहें। – GEOCHET

+0

फेंक ई; स्पष्ट रूप से गलत है लेकिन इसके अलावा यह एक दिलचस्प विचार है। सुनिश्चित नहीं है कि इसके लिए कोई उपयोग केस है .... – Quibblesome

3

आर्किटेक्चर (design patterns) मैं देख सकता इस में है, जहां एक सौदे संभाला जा रहा है इस्तेमाल किया जा रहा से एक। फ़ंक्शन इसके काम को विफल करता है, विफल रहता है, और कैच ब्लॉक एक ज्ञात स्थिति (आमतौर पर एक रोल बैक) को लेनदेन को पूरा करता है और फिर उपयोगकर्ता द्वारा परिभाषित अपवाद फेंकता है।

जैसा कि यह अभी खड़ा है, उस कोड को एक और अधिक संत राज्य में दोबारा दोहराएं।

1

न केवल कोशिश/पकड़ बिंदुहीन है, लेकिन आईएफ भी है। पूरे समारोह को एक पंक्ति में घटाया जा सकता है:

return successful 

किस बिंदु पर, परेशान क्यों? फ़ंक्शन को कॉल करने के बजाय "सफल" क्यों न करें?

ठीक है, ठीक है, यह एक वेब विधि है, मुझे लगता है कि आपको केवल अजाक्स या किसी भी संभाल देने के लिए फ़ंक्शन की आवश्यकता है।

(हाँ, मुझे पता है मेरा उत्तर 7 साल देर से। मैं सिर्फ यह भर में जब कुछ पूरी तरह से असंबंधित के लिए खोज ठोकर खाई है कर रहा हूँ।)

-2

मॉनिटर के लिए पैटर्न यह बहुत ही एक त्रुटि rethrow के रूप में आप की जरूरत है संभावना बढ़ जाती है एक अंत में सुनिश्चित करने के लिए Monitor.Exit

https://msdn.microsoft.com/en-us/library/4tssbxcw(v=vs.110).aspx

Dim lockObj As New Object() 

If Monitor.TryEnter(lockObj) Then 
    Try 
     ' The critical section. 
    Catch 
     throw 
    Finally 
     ' Ensure that the lock is released. 
     Monitor.Exit(lockObj) 
    End Try 
End If 
संबंधित मुद्दे