C # - obsługa wyjątków

Wyjątkiem jest problem, który pojawia się podczas wykonywania programu. Wyjątek AC # to odpowiedź na wyjątkowe okoliczności, które pojawiają się podczas działania programu, na przykład próba podzielenia przez zero.

Wyjątki umożliwiają przekazanie kontroli z jednej części programu do drugiej. Obsługa wyjątków C # jest oparta na czterech słowach kluczowych:try, catch, finally, i throw.

  • try- Blok try identyfikuje blok kodu, dla którego są aktywowane określone wyjątki. Po nim następuje jeden lub więcej bloków catch.

  • catch- Program przechwytuje wyjątek z obsługą wyjątków w miejscu programu, w którym chcesz obsłużyć problem. Słowo kluczowe catch wskazuje na przechwycenie wyjątku.

  • finally- Ostatni blok jest używany do wykonania danego zestawu instrukcji, niezależnie od tego, czy wyjątek został zgłoszony, czy nie. Na przykład, jeśli otworzysz plik, musi zostać zamknięty, niezależnie od tego, czy został zgłoszony wyjątek, czy nie.

  • throw- Program zgłasza wyjątek, gdy pojawia się problem. Odbywa się to za pomocą słowa kluczowego throw.

Składnia

Zakładając, że blok wywołuje wyjątek, metoda przechwytuje wyjątek przy użyciu kombinacji słów kluczowych try and catch. Blok try / catch jest umieszczany wokół kodu, który może generować wyjątek. Kod w bloku try / catch jest nazywany kodem chronionym, a składnia użycia try / catch wygląda następująco -

try {
   // statements causing exception
} catch( ExceptionName e1 ) {
   // error handling code
} catch( ExceptionName e2 ) {
   // error handling code
} catch( ExceptionName eN ) {
   // error handling code
} finally {
   // statements to be executed
}

Możesz wyszczególnić wiele instrukcji catch, aby złapać różne typy wyjątków w przypadku, gdy blok try wywoła więcej niż jeden wyjątek w różnych sytuacjach.

Klasy wyjątków w C #

Wyjątki C # są reprezentowane przez klasy. Klasy wyjątków w C # są głównie bezpośrednio lub pośrednio wyprowadzane zSystem.Exceptionklasa. Niektóre klasy wyjątków wywodzące się z klasy System.Exception to klasySystem.ApplicationException i System.SystemException zajęcia.

Plik System.ApplicationExceptionklasa obsługuje wyjątki generowane przez programy aplikacyjne. Stąd wyjątki zdefiniowane przez programistów powinny pochodzić z tej klasy.

Plik System.SystemException class jest klasą bazową dla wszystkich predefiniowanych wyjątków systemowych.

W poniższej tabeli przedstawiono niektóre z predefiniowanych klas wyjątków pochodzących z klasy Sytem.SystemException -

Sr.No. Klasa wyjątku i opis
1

System.IO.IOException

Obsługuje błędy we / wy.

2

System.IndexOutOfRangeException

Obsługuje błędy generowane, gdy metoda odwołuje się do indeksu tablicy spoza zakresu.

3

System.ArrayTypeMismatchException

Obsługuje błędy generowane, gdy typ jest niezgodny z typem tablicy.

4

System.NullReferenceException

Obsługuje błędy generowane podczas odwoływania się do obiektu o wartości null.

5

System.DivideByZeroException

Obsługuje błędy wynikające z dzielenia dywidendy przez zero.

6

System.InvalidCastException

Obsługuje błędy generowane podczas rzutowania.

7

System.OutOfMemoryException

Obsługuje błędy generowane z powodu niewystarczającej ilości wolnej pamięci.

8

System.StackOverflowException

Obsługuje błędy generowane przez przepełnienie stosu.

Obsługa wyjątków

C # zapewnia strukturalne rozwiązanie do obsługi wyjątków w postaci bloków try and catch. Za pomocą tych bloków podstawowe instrukcje programu są oddzielone od instrukcji obsługi błędów.

Te bloki obsługi błędów są implementowane przy użyciu try, catch, i finallysłowa kluczowe. Poniżej znajduje się przykład zgłaszania wyjątku, gdy występuje warunek dzielenia przez zero -

using System;

namespace ErrorHandlingApplication {
   class DivNumbers {
      int result;
      
      DivNumbers() {
         result = 0;
      }
      public void division(int num1, int num2) {
         try {
            result = num1 / num2;
         } catch (DivideByZeroException e) {
            Console.WriteLine("Exception caught: {0}", e);
         } finally {
            Console.WriteLine("Result: {0}", result);
         }
      }
      static void Main(string[] args) {
         DivNumbers d = new DivNumbers();
         d.division(25, 0);
         Console.ReadKey();
      }
   }
}

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Exception caught: System.DivideByZeroException: Attempted to divide by zero. 
at ...
Result: 0

Tworzenie wyjątków zdefiniowanych przez użytkownika

Możesz także zdefiniować własny wyjątek. Klasy wyjątków zdefiniowane przez użytkownika pochodzą zExceptionklasa. Poniższy przykład demonstruje to -

using System;

namespace UserDefinedException {
   class TestTemperature {
      static void Main(string[] args) {
         Temperature temp = new Temperature();
         try {
            temp.showTemp();
         } catch(TempIsZeroException e) {
            Console.WriteLine("TempIsZeroException: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}
public class TempIsZeroException: Exception {
   public TempIsZeroException(string message): base(message) {
   }
}
public class Temperature {
   int temperature = 0;
   
   public void showTemp() {
      
      if(temperature == 0) {
         throw (new TempIsZeroException("Zero Temperature found"));
      } else {
         Console.WriteLine("Temperature: {0}", temperature);
      }
   }
}

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

TempIsZeroException: Zero Temperature found

Rzucanie przedmiotów

Możesz zgłosić obiekt, jeśli pochodzi on bezpośrednio lub pośrednio z System.Exceptionklasa. Możesz użyć instrukcji throw w bloku catch, aby wyrzucić obecny obiekt jako -

Catch(Exception e) {
   ...
   Throw e
}