आपको लगभग कभी भी प्रयास/पकड़ का उपयोग नहीं करना चाहिए।
आपको केवल catch
अपवादों को अवश्य ही सही करना चाहिए, और केवल तभी जब आप उन्हें उम्मीद कर रहे हों। अन्यथा, कॉलर अपवाद को संभाल लें - या नहीं।
यदि उपयोग किया जाता है, तो catch
खंडों को पहले ही निष्पादित किया जाता है - उनमें से केवल एक ही।
फिर, finally
"आखिरकार" निष्पादित किया गया है।
यह कई स्थानों पर बेहतर कहा गया है, लेकिन मैं कोशिश करूंगा। निम्नलिखित कोड:
try
{
// Do something here
}
catch (Exception ex)
{
MessageBox.Show("Friendly error message");
}
अपवाद को ठीक नहीं करता है। यह अपवाद को छुपाता है ताकि समस्या कभी तय नहीं की जाएगी। उस कोड को पता नहीं है कि कौन सा अपवाद फेंक दिया गया था, क्योंकि यह उन सभी को पकड़ लेगा, और यह समस्या को ठीक करने के लिए कुछ भी नहीं करता है - यह सिर्फ उपयोगकर्ता को विनम्र कथा बताता है।
इस मामले के तथ्य यह है कि कोड के ऊपर निम्नलिखित के साथ प्रतिस्थापित किया जाना चाहिए है:
// Do something here
इस तरह इस विधि के फोन करने वाले जानता है विशेष रूप से समस्याओं को ठीक करने के लिए कैसे, तो फोन करने वाले उन्हें ठीक कर सकते हैं । आपने कॉलर से उस विकल्प को नहीं हटाया होगा।
यदि कॉलर को समस्या को ठीक करने का तरीका नहीं पता है, तो कॉलर को अपवाद भी नहीं पकड़ना चाहिए।
उचित तरीके से अपवादों का उपयोग करने के लिए यहां एक उदाहरण (एमएसडीएन से) है। यह SmtpFailedRecipientsException Class के दस्तावेज़ में उदाहरण का एक संशोधित रूप है।
public static void RetryIfBusy(string server)
{
MailAddress from = new MailAddress("[email protected]");
MailAddress to = new MailAddress("[email protected]");
using (
MailMessage message = new MailMessage(from, to)
{
Subject = "Using the SmtpClient class.",
Body =
@"Using this feature, you can send an e-mail message from an application very easily."
})
{
message.CC.Add(new MailAddress("[email protected]"));
using (SmtpClient client = new SmtpClient(server) {Credentials = CredentialCache.DefaultNetworkCredentials})
{
Console.WriteLine("Sending an e-mail message to {0} using the SMTP host {1}.", to.Address, client.Host);
try
{
client.Send(message);
}
catch (SmtpFailedRecipientsException ex)
{
foreach (var t in ex.InnerExceptions)
{
var status = t.StatusCode;
if (status == SmtpStatusCode.MailboxBusy || status == SmtpStatusCode.MailboxUnavailable)
{
Console.WriteLine("Delivery failed - retrying in 5 seconds.");
System.Threading.Thread.Sleep(5000); // Use better retry logic than this!
client.Send(message);
}
else
{
Console.WriteLine("Failed to deliver message to {0}", t.FailedRecipient);
// Do something better to log the exception
}
}
}
catch (SmtpException ex)
{
// Here, if you know what to do about particular SMTP status codes,
// you can look in ex.StatusCode to decide how to handle this exception
// Otherwise, in here, you at least know there was an email problem
}
// Note that no other, less specific exceptions are caught here, since we don't know
// what do do about them
}
}
}
ध्यान दें कि यह कोड कोड के एक छोटे टुकड़े को घेरने के लिए प्रयास/पकड़ का उपयोग करता है। उस कोशिश/पकड़ ब्लॉक के भीतर, यदि एक SmtpException या SmtpFailedRecipientsException फेंक दिया गया है, तो हम जानते हैं कि इसके बारे में क्या करना है। उदाहरण के लिए, हम IOException
पकड़ना चाहते थे, हम नहीं जानते कि इसका क्या अर्थ है, या इसके बारे में क्या करना है। कोई अपवाद जो आपको वास्तव में नहीं जानता है कि कैसे सही किया जाए, पकड़ा नहीं जाना चाहिए, सिवाय इसके कि अपवाद में जानकारी जोड़ने, इसे लॉग इन करने और फिर से निकालने के अलावा।
कृपया पूर्ण विराम उपयोग करना सीखना ('.') और प्रश्न चिह्न ('?') उचित रूप से। मैं आपके प्रश्न का कोई अर्थ नहीं बना सकता क्योंकि यह वर्तमान में खड़ा है। – BoltClock