2013-07-17 21 views
34

Chcę zrobić niestandardowy wyjątek w języku C#, ale teoretycznie muszę zrobić trochę parsowania, zanim będę mógł odczytać komunikat ExceptionMessage.Ustawianie komunikatu niestandardowego wyjątku bez przekazywania go do konstruktora podstawowego.

Problem polega na tym, że oryginalna wiadomość może być ustawiona tylko przez wywołanie konstruktora podstawowego Messsage, więc nie mogę wykonać żadnej analizy z góry.

Próbowałem overring właściwość Message tak:

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; } 
    } 
} 

Problemem jest to, że Visual Studio debugger nadal pojawia się komunikat, że już przekazany do konstruktora, Plep w tym przypadku.

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

skutkuje:

Visual Studio Exception Dialog

Gdybym opuścić konstruktor baza opróżnić pokaże bardzo ogólny wiadomość:

nieobsługiwany wyjątek typu 'App.CustomException' wystąpił w App.exe

Pytanie

Wygląda na to, że okno dialogowe wyjątków odczytuje niektóre pola/właściwości, do których również nie mam dostępu. Czy istnieje inny sposób ustawiania czytelnego dla człowieka komunikatu błędu poza konstruktorem podstawowym w Exception.

Zauważ, że używam programu Visual Studio 2012.

+0

Twój kod działał dobrze dla mnie. i to powinno działać. – Swift

+0

Kompiluje, ale jeśli rzucisz błąd, pokaże on wiadomość ("Plep") zamiast "Pokaż tę wiadomość". Proszę spojrzeć na dodatkowy przykład, który dodałem. –

+0

Myślę, że idealne rozwiązanie nie jest dostępne. Podobny problem wystąpił podczas przetwarzania klas wyjątków wholoe w JSON. Właściwości niestandardowe są tracone w procesie. Czy możesz opisać scenariusz? Być może możemy pomóc w pewnym obejściu problemu. – Minduca

Odpowiedz

65

Po prostu umieść kod formatujący w statycznej metodzie?

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

Idealne! Nawet nie zdawałem sobie sprawy, że można nazwać metodę statyczną w sekcji argumentów konstruktora bazowego! –

+1

Ah .. musicie poczekać 19 godzin, zanim będę mógł przyznać ci nagrodę. Całkiem fajne, że ustawienie nagrody faktycznie działa;) –

11

Rozważyć wytyczne Microsoft do tworzenia nowych wyjątków:

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); 
    } 
    } 

Note statyczna metoda fabrycznie (nie jest częścią wzoru), które można użyj w swoim programie w ten sposób:

throw CustomException.FromJson(variable); 

W ten sposób postępujesz zgodnie z najlepszą praktyką i możesz analizować swój json w klasie wyjątków.

+5

To zadziałałoby ... ale w pewnym sensie wciąż pracujesz nad standardami. Nigdy nie wyrzucałem wyjątku, wywołując metodę statyczną - domyślne wyjątki platformy .NET również nie mają statycznej metody wywoływania tego wyjątku. Raczej tego nie zrobię, ponieważ nie jest to łatwe do wykrycia dla innych programistów. –

+2

Oba odsyłacze w komentarzu są zepsute. Nowy link: [Wytyczne projektowania wyjątków] (https://msdn.microsoft.com/en-us/library/ms229014 (v = vs.100) .aspx) –

7

Myślę, że problem może dotyczyć debugera Visual Studio. Mam dokładnie te same rezultaty dostał za pomocą debuggera, ale kiedy wydrukować wiadomość Zamiast:

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); 
     } 
    } 
} 

uzyskać oczekiwany "Show this message".

Jeśli umieścisz punkt przerwania w miejscu wychwycenia wyjątku, debugger wyświetli poprawny komunikat.

+1

Wiem, ale problem dotyczy właśnie okna dialogowego, które pokazał debager Visual Studio (patrz zrzut ekranu). Właśnie zmęczyłem się (i pomyślałem, że to było dość brzydkie), by stale patrzeć na wewnętrzny Wyjątek lub inne sposoby, aby zobaczyć oryginalną wiadomość. –

0

Lubię używać tego tutaj. Jest łatwy i nie potrzebuje funkcji statycznej:

public class MyException : Exception 
{ 
    public MyException() : base("This is my Custom Exception Message") 
    { 
    } 
} 
Powiązane problemy