3
respostas

[Dúvida] Duvida relacionada ao throw; em C#( Entendendo Excecoes)

Fiquei em dúvida sobre o uso do throw; pois ele lanca uma exceção? para qual catch? que tipo de exceção? realmente não compreendi direito o throw; (porém o throw new <objeto da exceção> eu entendi direitinho)

3 respostas

O Throw repassa a exceção, ou seja, delega a responsabilidade de tratar para o proximo da fila

try { Metodo(); } catch(ArgumentNullException ex) { throw; } catch(ArgumentException ex) { Console.WriteLine(ex.Message);

    }  //com esse exemplo o throw repassaria a excessao para o ArgumentException?

Throw = do inglês lançar

Quando um Throw; é chamado ele simplesmente pega a exception capturada no catch e lança para o método que a chamou

Se o método que chamou não estiver dentro de um bloco try, essa Exception será lançada para o usuário.

Uma outra possibilidade quando se cai em um bloco catch é criar uma nova Exception e lança-la. Daí vc utiliza o throw new QlqrException();

Isto posto, peguei um código pronto lá na doc do C# pra tentar ilustrar:

using System;

namespace Throw
{

public class Sentence
{
   public Sentence(string s)
   {
      Value = s;
   }

   public string Value { get; set; }

   public char GetFirstCharacter()
   {
      try
      {
         return Value[0];
      }
      catch (NullReferenceException e)
      {
         throw;
      }
   }
}

Observe o código acima e pense na seguinte utilização:

public class Example
{
   public static void Main()
   {
      var s = new Sentence(null);
      Console.WriteLine($"The first character is {s.GetFirstCharacter()}");
   }
}

O que ocorre?

na chamada de s.GetFirstCharacter() o método encontra uma NullReferennceException e simplesmente lança essa Exception para o método que o chamou (O Main) como não há tratativa alguma ali, o Main estoura a pilha de execução e lança a Exception para o usuário:

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
      at Sentence.GetFirstCharacter()
      at Example.Main()

segue link da documentação oficial: https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/keywords/throw