try {
// Do stuff
}
catch (Exception e) {
throw;
}
finally {
// Clean up
}
उपरोक्त ब्लॉक में अंत में ब्लॉक कब कहा जाता है? ई के फेंकने से पहले या अंत में बुलाया जाता है और फिर पकड़ा जाता है?
try {
// Do stuff
}
catch (Exception e) {
throw;
}
finally {
// Clean up
}
उपरोक्त ब्लॉक में अंत में ब्लॉक कब कहा जाता है? ई के फेंकने से पहले या अंत में बुलाया जाता है और फिर पकड़ा जाता है?
जवाबों:
इसे ई-री-थ्रो (यानी कैच ब्लॉक के निष्पादित होने के बाद) कहा जाएगा
इसे 7 साल बाद संपादित करना - एक महत्वपूर्ण नोट यह है कि यदि eकॉल स्टैक को पकड़ने / पकड़ने के प्रयास से नहीं पकड़ा जाता है या वैश्विक अपवाद हैंडलर द्वारा नियंत्रित किया जाता है, तो finallyब्लॉक कभी भी निष्पादित नहीं हो सकता है ।
finallyयदि पूर्ववर्ती में फेंका गया अपवाद बाहरी - ब्लॉक में catchकभी नहीं पकड़ा गया तो उसे निष्पादित नहीं किया जाता है ! trycatch
क्यों नहीं इसे आज़माएँ:
outer try
inner try
inner catch
inner finally
outer catch
outer finally
कोड के साथ (ऊर्ध्वाधर स्थान के लिए स्वरूपित):
static void Main() {
try {
Console.WriteLine("outer try");
DoIt();
} catch {
Console.WriteLine("outer catch");
// swallow
} finally {
Console.WriteLine("outer finally");
}
}
static void DoIt() {
try {
Console.WriteLine("inner try");
int i = 0;
Console.WriteLine(12 / i); // oops
} catch (Exception e) {
Console.WriteLine("inner catch");
throw e; // or "throw", or "throw anything"
} finally {
Console.WriteLine("inner finally");
}
}
outer try inner try inner catch Unhandled Exception: System.DivideByZeroException...
यहाँ सभी उत्तरों को पढ़ने के बाद ऐसा लगता है कि अंतिम उत्तर यह निर्भर करता है :
यदि आप कैच ब्लॉक के भीतर एक अपवाद को फिर से फेंकते हैं, और वह अपवाद किसी अन्य कैच ब्लॉक के अंदर पकड़ा जाता है, तो सब कुछ प्रलेखन के अनुसार निष्पादित होता है।
हालाँकि, यदि पुन: trown अपवाद अखंडित है, तो अंत में कभी निष्पादित नहीं होता है।
मैंने VS2010 w / C # 4.0 में इस कोड नमूने का परीक्षण किया
static void Main()
{
Console.WriteLine("Example 1: re-throw inside of another try block:");
try
{
Console.WriteLine("--outer try");
try
{
Console.WriteLine("----inner try");
throw new Exception();
}
catch
{
Console.WriteLine("----inner catch");
throw;
}
finally
{
Console.WriteLine("----inner finally");
}
}
catch
{
Console.WriteLine("--outer catch");
// swallow
}
finally
{
Console.WriteLine("--outer finally");
}
Console.WriteLine("Huzzah!");
Console.WriteLine();
Console.WriteLine("Example 2: re-throw outside of another try block:");
try
{
Console.WriteLine("--try");
throw new Exception();
}
catch
{
Console.WriteLine("--catch");
throw;
}
finally
{
Console.WriteLine("--finally");
}
Console.ReadLine();
}
यहाँ उत्पादन है:
उदाहरण 1: एक और कोशिश ब्लॉक के अंदर फिर से फेंक दें: -
राउटर आज़माएं
---- भीतर की कोशिश
---- इनर कैच
---- इनर अंत -
राउटर
कैच- राउटर आखिरकार
फुज़ा!उदाहरण 2: एक और कोशिश ब्लॉक के बाहर फिर से फेंकें:
--try
--catchअखंडित अपवाद: System.Exception: अपवाद का प्रकार 'System.Exception' फेंका गया था।
ConsoleApplication1.Program.Main () में C: \ स्थानीय स्रोत \ ConsoleApplication1 \ Program.cs: पंक्ति 53
आपका उदाहरण इस कोड के लिए समान रूप से व्यवहार करेगा:
try {
try {
// Do stuff
} catch(Exception e) {
throw e;
}
} finally {
// Clean up
}
एक तरफ ध्यान दें के रूप में, यदि आप वास्तव में मतलब throw e;(यह है कि, एक ही अपवाद तुम सिर्फ पकड़ा फेंक), यह है बहुत अभी करना बेहतर throw;है, क्योंकि है कि एक नया बनाने की बजाय मूल स्टैक ट्रेस भी सुरक्षित रहेंगे।
finallyब्लॉक वास्तव में बाद चलने लगेंगे catchब्लॉक (भले ही कैच ब्लॉक अपवाद rethrows) है, जो है क्या मेरी टुकड़ा वर्णन करने के लिए कोशिश कर रहा है।
tryब्लॉक के अंदर मेरे जवाब में "कोशिश-पकड़" है। मैं दो 2-भाग निर्माणों का उपयोग करके 3-भाग के निर्माण के व्यवहार को समझाने की कोशिश कर रहा हूं। मुझे tryमूल प्रश्न में दूसरे ब्लॉक का कोई संकेत दिखाई नहीं दे रहा है , इसलिए मुझे समझ नहीं आ रहा है कि आपको वह कहाँ मिल रहा है।
यदि कैच हैंडलर ब्लॉक के अंदर एक अखंडित अपवाद है, तो अंत में ब्लॉक बिल्कुल शून्य बार कहा जाता है
static void Main(string[] args)
{
try
{
Console.WriteLine("in the try");
int d = 0;
int k = 0 / d;
}
catch (Exception e)
{
Console.WriteLine("in the catch");
throw;
}
finally
{
Console.WriteLine("In the finally");
}
}
आउटपुट:
C: \ उपयोगकर्ताओं \ व्यवस्थापक \ दस्तावेज \ TestExceptionNesting \ बिन \ रिलीज> TestExceptionNesting.exe
कोशिश में
पकड़ में
अखंडित अपवाद: System.DivideByZeroException: शून्य से विभाजित करने का प्रयास किया गया। TestExceptionNesting.Program.Main (String [] args) पर C: \ Users \ व्यवस्थापक \ दस्तावेज \ TestExceptionNesting \ TestExceptionNesting.cs: पंक्ति 22
C: \ उपयोगकर्ताओं \ व्यवस्थापक \ दस्तावेज \ TestExceptionNesting \ बिन \ रिहाई>
मुझे आज एक साक्षात्कार में यह सवाल मिला और साक्षात्कारकर्ता वापस जा रहा है "क्या आप सुनिश्चित हैं कि आखिरकार बुलाया नहीं जाता है?" मैं अनिश्चित था अगर यह एक ट्रिकी प्रश्न था या साक्षात्कारकर्ता के दिमाग में कुछ और था और मेरे लिए डिबग करने के लिए गलत कोड लिखा था, इसलिए मैंने घर आकर इसे बनाने की कोशिश की (निर्माण और रन, कोई डिबगर इंटरैक्शन नहीं), बस अपना दिमाग लगाने के लिए आराम।
C # कंसोल एप्लिकेशन के साथ परीक्षण, अपवाद को फेंक दिए जाने के बाद अंत में कोड निष्पादित किया गया है: "एप्लिकेशन त्रुटि डायलॉग" अस्तित्व में था और आपके द्वारा "प्रोग्राम बंद करें" विकल्प चुनने के बाद, अंत में ब्लॉक को उस कंसोल विंडो में निष्पादित किया गया था। लेकिन अंत में कोड ब्लॉक के अंदर ब्रेकिंग पॉइंट सेट करना, मैं इसे कभी हिट नहीं कर सकता। डिबगर थ्रो स्टेटमेंट पर रुकता रहता है। यहाँ मेरा परीक्षण कोड है:
class Program
{
static void Main(string[] args)
{
string msg;
Console.WriteLine(string.Format("GetRandomNuber returned: {0}{1}", GetRandomNumber(out msg), msg) == "" ? "" : "An error has occurred: " + msg);
}
static int GetRandomNumber(out string errorMessage)
{
int result = 0;
try
{
errorMessage = "";
int test = 0;
result = 3/test;
return result;
}
catch (Exception ex)
{
errorMessage = ex.Message;
throw ex;
}
finally
{
Console.WriteLine("finally block!");
}
}
}
VS2010 में डिबगिंग - .NET फ्रेमवर्क 4.0