C # - Tratamento de exceções

Uma exceção é um problema que surge durante a execução de um programa. A exceção AC # é uma resposta a uma circunstância excepcional que surge durante a execução de um programa, como uma tentativa de divisão por zero.

As exceções fornecem uma maneira de transferir o controle de uma parte de um programa para outra. O tratamento de exceções C # é baseado em quatro palavras-chave:try, catch, finallye throw.

  • try- Um bloco try identifica um bloco de código para o qual exceções específicas são ativadas. Ele é seguido por um ou mais blocos catch.

  • catch- Um programa captura uma exceção com um manipulador de exceção no local de um programa onde você deseja manipular o problema. A palavra-chave catch indica a captura de uma exceção.

  • finally- O bloco finally é usado para executar um determinado conjunto de instruções, seja uma exceção lançada ou não. Por exemplo, se você abrir um arquivo, ele deve ser fechado independentemente de haver uma exceção ou não.

  • throw- Um programa lança uma exceção quando um problema aparece. Isso é feito usando uma palavra-chave throw.

Sintaxe

Assumindo que um bloco levanta uma exceção, um método captura uma exceção usando uma combinação das palavras-chave try e catch. Um bloco try / catch é colocado ao redor do código que pode gerar uma exceção. O código dentro de um bloco try / catch é referido como código protegido, e a sintaxe para usar try / catch se parece com a seguinte -

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
}

Você pode listar várias instruções catch para capturar diferentes tipos de exceções no caso de seu bloco try gerar mais de uma exceção em diferentes situações.

Classes de exceção em C #

As exceções C # são representadas por classes. As classes de exceção em C # são derivadas principalmente direta ou indiretamente doSystem.Exceptionclasse. Algumas das classes de exceção derivadas da classe System.Exception são asSystem.ApplicationException e System.SystemException Aulas.

o System.ApplicationExceptionclasse oferece suporte a exceções geradas por programas aplicativos. Portanto, as exceções definidas pelos programadores devem derivar dessa classe.

o System.SystemException class é a classe base para todas as exceções de sistema predefinidas.

A tabela a seguir fornece algumas das classes de exceção predefinidas derivadas da classe Sytem.SystemException -

Sr. Não. Classe de exceção e descrição
1

System.IO.IOException

Lida com erros de E / S.

2

System.IndexOutOfRangeException

Lida com erros gerados quando um método se refere a um índice de matriz fora do intervalo.

3

System.ArrayTypeMismatchException

Lida com erros gerados quando o tipo não corresponde ao tipo de matriz.

4

System.NullReferenceException

Lida com erros gerados por referência a um objeto nulo.

5

System.DivideByZeroException

Lida com erros gerados pela divisão de um dividendo com zero.

6

System.InvalidCastException

Lida com erros gerados durante o typecasting.

7

System.OutOfMemoryException

Lida com erros gerados por memória livre insuficiente.

8

System.StackOverflowException

Lida com erros gerados por estouro de pilha.

Tratamento de exceções

C # fornece uma solução estruturada para o tratamento de exceções na forma de blocos try e catch. Usando esses blocos, as instruções do programa principal são separadas das instruções de tratamento de erros.

Esses blocos de tratamento de erros são implementados usando o try, catche finallypalavras-chave. A seguir está um exemplo de lançamento de uma exceção quando ocorre a divisão por 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();
      }
   }
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

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

Criação de exceções definidas pelo usuário

Você também pode definir sua própria exceção. As classes de exceção definidas pelo usuário são derivadas doExceptionclasse. O exemplo a seguir demonstra isso -

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

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

TempIsZeroException: Zero Temperature found

Atirando Objetos

Você pode lançar um objeto se ele for direta ou indiretamente derivado do System.Exceptionclasse. Você pode usar uma instrução throw no bloco catch para lançar o objeto presente como -

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