2013-07-17 3 views
34

पर पास किए बिना कस्टम अपवाद का संदेश सेट करना मैं सी # में एक कस्टम अपवाद बनाना चाहता हूं, लेकिन सिद्धांत में मुझे मानव पठनीय अपवाद मैसेज बनाने से पहले थोड़ा पार्सिंग करने की आवश्यकता है।बेस कन्स्ट्रक्टर

समस्या यह है कि मूल संदेश केवल Messsage के बेस कन्स्ट्रक्टर को कॉल करके सेट किया जा सकता है, इसलिए मैं अग्रिम में कोई पार्सिंग नहीं कर सकता।

कि
public class CustomException : Exception 
{ 
    string _Message; 

    public CustomException(dynamic json) : base("Plep") 
    { 
     // Some parsing to create a human readable message (simplified) 
     _Message = json.message; 
    } 

    public override string Message 
    { 
     get { return _Message; } 
    } 
} 

समस्या है विजुअल स्टूडियो डीबगर अभी भी संदेश है कि मैं निर्माता में पारित कर दिया गया है, Plep इस मामले में पता चलता है:

मैं इस तरह संदेश संपत्ति overring की कोशिश की।

throw new CustomException(new { message="Show this message" }) 

परिणामों में:

Visual Studio Exception Dialog

अगर मैं आधार निर्माता खाली यह एक बहुत ही सामान्य संदेश दिखाई देगा छोड़:

प्रकार 'App.CustomException' की एक बिना क्रिया का अपवाद हुआ App.exe

प्रश्न

ऐसा लगता है कि अपवाद संवाद कुछ फ़ील्ड/संपत्ति को पढ़ता है जिसमें मेरे पास कोई पहुंच नहीं है। अपवाद पर बेस कन्स्ट्रक्टर के बाहर मानव पठनीय त्रुटि संदेश सेट करने का कोई और तरीका है।

ध्यान दें कि मैं दृश्य स्टूडियो 2012

+0

आपका कोड मेरे लिए ठीक काम करता है। और यह काम करना चाहिए। – Swift

+0

यह संकलित करता है, लेकिन यदि आप कोई त्रुटि फेंकते हैं तो यह "यह संदेश दिखाएं" के बजाय अंतर्निहित संदेश ("Plep") दिखाएगा। कृपया जो अतिरिक्त उदाहरण मैंने जोड़ा है उसे देखें। –

+0

मुझे लगता है कि आदर्श समाधान उपलब्ध नहीं है। मैं एक ही समस्या पर गया जब मैंने जेएसओएन को व्हाइलो अपवाद कक्षाओं को पार्स किया। प्रक्रिया में कस्टम गुण खो गए हैं। क्या आप एक परिदृश्य का वर्णन कर सकते हैं? शायद हम कुछ कामकाज में मदद कर सकते हैं। – Minduca

उत्तर

65

बस स्वरूपण कोड को एक स्थिर विधि में डालें?

public CustomException(dynamic json) : base(HumanReadable(json)) {} 
private static string HumanReadable(dynamic json) { 
    return whatever you need to; 
} 
+1

बिल्कुल सही! यह भी पता नहीं था कि आप वास्तव में बेस कन्स्ट्रक्टर के तर्क अनुभाग के अंदर एक स्थिर विधि को कॉल कर सकते हैं! –

+1

आह .. मुझे आपको बक्षीस देने से पहले 1 9 घंटे इंतजार करना होगा। बहुत अच्छा है कि एक बाउंटी सेट करना वास्तव में काम करता है;) –

11

उपयोग कर रहा हूँ नया अपवाद बनाने के लिए माइक्रोसॉफ्ट के दिशा निर्देशों पर विचार करें: है कि आप कर सकते हैं

using System; 
    using System.Runtime.Serialization; 

    [Serializable] 
    public class CustomException : Exception 
    { 
    // 
    // For guidelines regarding the creation of new exception types, see 
    // https://msdn.microsoft.com/en-us/library/ms229064(v=vs.100).aspx 
    // 

    public CustomException() 
    { 
    } 

    public CustomException(string message) : base(message) 
    { 
    } 

    public CustomException(string message, Exception inner) : base(message, inner) 
    { 
    } 

    protected CustomException(SerializationInfo info, StreamingContext context) : base(info, context) 
    { 
    } 

    public static CustomException FromJson(dynamic json) 
    { 
     string text = ""; // parse from json here 

     return new CustomException(text); 
    } 
    } 

नोट स्थिर कारखाने विधि (पैटर्न का हिस्सा नहीं), इस तरह के अपने कार्यक्रम में उपयोग करें:

throw CustomException.FromJson(variable); 

इस तरह आपने सर्वोत्तम अभ्यास किया और अपवाद वर्ग के अंदर अपने जेसन को पार्स कर सकते हैं।

+5

यह काम करेगा .. लेकिन एक तरह से आप अभी भी मानकों के आसपास काम कर रहे हैं। मैंने एक स्थैतिक विधि का आह्वान करके कभी अपवाद नहीं फेंक दिया - डिफ़ॉल्ट .NET अपवादों के पास उन्हें आमंत्रित करने के लिए एक स्थिर विधि भी नहीं है। मैं यह नहीं करूँगा, क्योंकि यह अन्य प्रोग्रामर के लिए बहुत खोज योग्य नहीं है। –

+2

टिप्पणी में दोनों लिंक टूटे हैं। नया लिंक: [अपवादों के लिए डिजाइन दिशानिर्देश] (https://msdn.microsoft.com/en-us/library/ms229014 (v = vs.100) .aspx) –

7

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

class CustomException : Exception { 
    public CustomException(dynamic json) 
     : base("Plep") { 
      _Message = json.message; 
    } 

    public override string Message { 
     get { return _Message; } 
    } 

    private string _Message; 
} 

class Program { 
    static void Main(string[] args) { 
     try { 
      throw new CustomException(new { message = "Show this message" }); 
     } catch (Exception ex) { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

मैं उम्मीद "Show this message" मिलता है।

यदि आप ब्रेकपॉइंट डालते हैं जहां अपवाद पकड़ा जाता है, तो डीबगर आपको सही संदेश दिखाता है।

+1

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

0

मुझे यह यहां उपयोग करना पसंद है। यह आसान है और स्थिर कार्य की आवश्यकता नहीं है:

public class MyException : Exception 
{ 
    public MyException() : base("This is my Custom Exception Message") 
    { 
    } 
} 
संबंधित मुद्दे