Prawidłowe definiowanie wyjątków w c#

Programując własne biblioteki, często potrzebujemy zdefiniować własny typ wyjątku. Przeglądając różnego rodzaju kody źródłowe nierzadko spotykam błędną deklarację własnych wyjątków:

 public class MyException : Exception
 {
    // specyfikacja
 }

Co prawa kompilator nie zgłosi błędu ale już np. CodeAnalysis zwróci nam uwagę o błędnej deklaracji. Najprościej korzystać w Visual Studio z tzw. snippet’ów czyli gotowych fragmentów kodu. Naciskając klawisze ctrl+space pojawi nam się lista dostępnych snippetów w VS:

snippetsWybieramy oczywiście Exception a automatycznie zostanie wstawiony poniższy fragment kodu:

    [Serializable]
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string message) : base(message) { }
        public MyException(string message, Exception inner) : base(message, inner) { }
        protected MyException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
    }

Jak widać deklaracja jest bardziej złożona ponieważ prawidłowa implementacja wyjątku wymaga uwzględnienia mechanizmu serializacji czyli zapisu klasy np. do pliku XML. Potrzebne jest to do wysyłania klasy zdalnie przez sieć.Wyobraźmy sobie sytuacje w której nasza biblioteka zostaje wyeksponowana za pomocą WCF. W takim przypadku jeśli chcemy zwracać wyjątki do klienta muszą one być zapisane do jakiegoś formatu(np. XML) i zwrócone zdalnie klientowi.

2 thoughts on “Prawidłowe definiowanie wyjątków w c#”

  1. Coś mało informacji w tym poście. Mógłbyś rozwinąć ten temat? Co w przypadku, gdy wyjątek wyrzuci wyjątek, jak obsługiwać takie przypadki? Czy przy wyrzuceniu wyjątku będziemy mieli informacje o stosie i wyjątku wewnętrznym? Czy masz jakieś doświadczenia w tworzeniu custom’owych klas wyjątków i sposobu ich użycia? Może jakieś przykłady?

  2. @Slawek
    Post jest o definiowaniu wyjatkow a nie obludze. Obsluga to inna bajka i mozna o nim napisac dlugi artykul a nie taka byla moja intencja tutaj

Leave a Reply

Your email address will not be published.