2015-05-01 10 views
16

के बिना कस्टम अपवाद फेंकने का कोई तरीका है क्या कस्टम अपवाद फेंकने के लिए सी # (यानी .NET में) में कोई तरीका है लेकिन Exception से प्राप्त अपनी अपवाद कक्षा को परिभाषित करने के लिए सभी कोड लिखने के बिना?अपवाद वर्ग

मैं ऐसी ही कुछ सोच रहा हूँ आप ओरेकल PL/SQL में उदाहरण है, जहां आप बस किसी भी स्थान पर

raise_application_error(-20001, 'An arbitary error message'); 

लिख सकते हैं के लिए है।

+0

आप कस्टम अपवाद वर्ग में कस्टम गुण जोड़ सकते हैं, तो क्या आप केवल एक कस्टम अपवाद वर्ग नहीं बना सकते हैं, फिर अपवाद के "प्रकार" के लिए एक एनम जोड़ें? – mellamokb

+6

यदि 'नया अपवाद फेंक दें ("एक आर्बेटरी त्रुटि संदेश");' आपके लिए काम नहीं करेगा, यह समझाने के लिए एक प्रश्न का विस्तार करना एक अच्छा विचार हो सकता है कि क्यों। –

+0

नहीं, ऐसा नहीं होना चाहिए और वहां नहीं होना चाहिए। –

उत्तर

29
throw new Exception("A custom message for an application specific exception"); 

पर्याप्त नहीं है?

यदि आप प्रासंगिक हैं तो आप एक और विशिष्ट अपवाद भी फेंक सकते हैं। उदाहरण के लिए,

throw new AuthenticationException("Message here"); 

या

throw new FileNotFoundException("I couldn't find your file!"); 

काम कर सकता था।

ध्यान दें कि आपको शायद throw new ApplicationException() प्रति MSDN पर होना चाहिए।

अपवाद को अनुकूलित नहीं करने का मुख्य ड्रॉ यह है कि कॉलर्स को पकड़ना अधिक कठिन होगा - वे नहीं जानते होंगे कि यह एक सामान्य अपवाद था या जो आपके अपवाद पर कुछ भयानक निरीक्षण किए बिना आपके कोड के लिए विशिष्ट है संपत्ति संपत्ति। आप इस तरह के कुछ सरल कर सकते हैं:

public class MyException : Exception 
{ 
    MyException(int severity, string message) : base(message) 
    { 
     // do whatever you want with severity 
    } 
} 

इससे बचने के लिए।

अद्यतन: दृश्य स्टूडियो अब 2015 अपवाद विस्तार वर्ग के कुछ स्वचालित कार्यान्वयन प्रदान करता है - अगर आप त्वरित कार्रवाइयां और : Exception पर कर्सर के साथ पुनर्रचना मेनू खोलते हैं, तो बस यह बता "सभी कंस्ट्रक्टर्स उत्पन्न करने के लिए"।

+2

आपको 'एप्लिकेशन अपवाद' वर्ग का उपयोग नहीं करना चाहिए, यहां टिप्पणियां देखें: https://msdn.microsoft.com/en-us/library/system.applicationexception%28v=vs.110%29.aspx –

+0

एप्लिकेशन अपवाद प्रभावी ढंग से बहिष्कृत। –

+0

ओपी के रूप में यह एक "कस्टम" अपवाद नहीं है। हालांकि, मुझे इस कथन को समझने में अधिक दिलचस्पी है: "ध्यान दें कि आपको शायद नए अपवाद() को फेंकना नहीं चाहिए, क्योंकि इससे अन्य समस्याएं हो सकती हैं ._ "- क्या आप आगे बता सकते हैं? –

3

तुम बस अपवाद जो .NET में उपलब्ध है में से एक फेंक कर सकते हैं:

throw new System.ArgumentException("Parameter cannot be null", "original"); 

या अधिक सामान्य:

throw new ApplicationException("File storage capacity exceeded."); 
6

लघु जवाब - कोई।

कस्टम अपवादों के उत्थान को लागू करने का एक अच्छा कारण है; लोगों को उन्हें संभालने में सक्षम होना चाहिए। यदि आप बिना किसी प्रकार के अपने कस्टम अपवाद को फेंक सकते हैं, तो लोग उस अपवाद प्रकार को पकड़ने में सक्षम नहीं होंगे।

यदि आप एक कस्टम अपवाद नहीं लिखना चाहते हैं, तो मौजूदा अपवाद प्रकार का उपयोग करें।

5

Exception वर्ग एक abstract नहीं है, और अपवाद .NET में परिभाषित के सबसे की तरह, निर्माता भार के से एक में एक string message लेता है - आप इसलिए एक मौजूदा अपवाद प्रकार का उपयोग कर सकते हैं, लेकिन एक स्वनिर्धारित संदेश के साथ।

throw new Exception("Something has gone haywire!"); 
throw new InvalidOperationException("He's Dead, Jim"); 
throw new InvalidCastException(
    string.format("Damnit Jim I'm a {0}, not a {1}!", 
     a.GetType().Name, b.GetType().Name)); 

क्योंकि इस प्रकार के अपवाद है कि जाना जाता है का उपयोग करता है, यह आसान तृतीय पक्ष आपके पुस्तकालयों रूप में अच्छी तरह का विस्तार करने के लिए बनाता है, क्योंकि वे MyArbitraryExceptioncatch में बयान के लिए देखो की जरूरत नहीं है।

+5

मुझे याद रखना होगा कि 'अवैध कैस्ट अपवाद'! –

0

सी # में कस्टम अपवाद बनाने का एक आसान तरीका एक सामान्य वर्ग का उपयोग कर रहा है। यदि आपको अधिक अपवाद बनाने की आवश्यकता है तो यह नाटकीय रूप से कोड की रेखाओं को कम कर देता है (यानी यदि आपको अपने यूनिट परीक्षणों में उनके बीच अंतर करने की आवश्यकता है)।

पहले एक सरल CustomException<T> बुलाया वर्ग बनाने के लिए:

public class CustomException<T> : Exception where T : Exception 
{ 
    public CustomException() { } 
    public CustomException(string message) : base(message){ } 
    public CustomException(string message, Exception innerException) : base(message, innerException){ } 
    public CustomException(SerializationInfo info, StreamingContext context) : base(info, context){ } 
} 

आप के रूप में कई निर्माताओं और तरीकों के रूप में आप चाहते हैं (या जरूरत) ओवरराइड कर सकते हैं।

public class MyCustomException : Exception { } 
public class SomeOtherException : Exception { } 

आप अपने कस्टम अपवाद उपयोग को बढ़ाने के लिए चाहते हैं: नए अपवाद प्रकार बनाने के लिए सिर्फ नया एक-लाइनर वर्गों को जोड़ने

throw new CustomException<MyCustomException>("your error description"); 

यह आपके अपवाद कोड सरल रहता है और आप को अलग करने के लिए अनुमति देता है उन अपवादों के बीच:

try 
{ 
    // ... 
} 
catch(CustomException<MyCustomException> ex) 
{ 
    // handle your custom exception ... 
} 
catch(CustomException<SomeOtherException> ex) 
{ 
    // handle your other exception ... 
} 
संबंधित मुद्दे