2010-03-25 26 views
5

के भीतर से अपवाद निम्न कोड पर विचार करें जहां LockDevice() संभवतः विफल हो सकता है और अपने आप पर अपवाद फेंक सकता है। अंत में ब्लॉक के भीतर से अपवाद उठाए जाने पर सी # में क्या होता है?अंततः ब्लॉक

 
UnlockDevice(); 

try 
{ 
    DoSomethingWithDevice(); 
} 
finally 
{ 
    LockDevice(); // can fail with an exception 
} 
+0

एक और अच्छा सवाल "UnlockDevice डिवाइस तब अनलॉक हो लेकिन कोशिश संरक्षित क्षेत्र दर्ज किया गया है से पहले के बाद अगर एक धागा बीच में बंद करें अपवाद उठाया है कि क्या होता है?" है उत्तर: डिवाइस अनलॉक रहता है। यह असुरक्षित कोड की तरह दिखता है। –

उत्तर

10

वास्तव में एक ही बात है कि अगर यह एक अंत में ब्लॉक में नहीं था क्या होगा - एक अपवाद उस बिंदु से प्रचार कर सकते हैं। आप की जरूरत है, तो आप से कोशिश कर सकते हैं/कैच अंत में अंदर:

try 
{ 
    DoSomethingWithDevice(); 
} 
finally 
{ 
    try 
    { 
     LockDevice(); 
    } 
    catch (...) 
    { 
     ... 
    } 
} 
-2

विधि प्रयास कहा जाता है/पकड़ने

कहाँ अपनी पकड़ है?

UnlockDevice(); 

try 
{ 
    DoSomethingWithDevice(); 
} 
catch(Exception ex) 
{ 
    // Do something with the error on DoSomethingWithDevice() 
} 
finally 
{ 
    try 
    { 
     LockDevice(); // can fail with an exception 
    } 
    catch (Exception ex) 
    { 
     // Do something with the error on LockDevice() 
    } 
} 
+1

निश्चित रूप से यह उचित है कि उस विधि से उठाए गए अपवाद के साथ कुछ रचनात्मक करना संभव हो। ऐसा करने के लिए उपयुक्त कुछ भी नहीं है जब इसे पकड़ना बहुत बेकार है। – Paddy

+0

@ पैडी आपको बाद में समीक्षा के लिए इसे कम से कम समीक्षा करना चाहिए कि यह क्यों अपवाद उठाया गया है ... – balexandre

+0

मैं कहूंगा कि यह निर्भर करता है कि अपवादों को संभालने के लिए आपका सिस्टम कैसे स्थापित किया गया है - कुछ मामलों में यह अपवाद को अनुमति देने के लिए अधिक समझ में आता है लॉगिंग लाइनों के साथ अपने कोड को अव्यवस्थित करने के बजाय, सभी अपवादों को लॉग इन करने के लिए सिस्टम की बाहरी परत को बबल करें और छोड़ दें। यदि आप अपवाद को निगलते हैं, तो आपको निश्चित रूप से लॉग इन करना चाहिए। – Paddy

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