Pergunta

Eu estou escrevendo uma classe personalizada em C # e eu estou jogando algumas exceções, se as pessoas dão as entradas erradas em alguns dos métodos. Se a exceção é lançada, será que algum do código no método após o lance ainda ser executado? Eu tenho que colocar uma pausa após o lance, ou faz um lance, saia sempre do método?

Foi útil?

Solução

Quando você jogar uma exceção, o seguinte código para obter executado é qualquer bloco catch que as tampas que jogam dentro do método (se houver), em seguida, o bloco finally (se houver). Você pode ter uma tentativa, um try-catch, um try-catch-finally ou de um try-finally. Então, se a exceção não é tratada, re-lançada por um bloco catch ou não pego em tudo, o controle é retornado ao chamador. Por exemplo, você vai ficar "Sim1, Sim2, Sim3" deste código ...

try
{
    Console.WriteLine("Yes1");
    throw (new Exception());
    Console.WriteLine("No1");

}
catch
{
    Console.WriteLine("Yes2");
    throw;
    Console.WriteLine("No2");
}
finally
{
    Console.WriteLine("Yes3");
}

Console.WriteLine("No3");

Outras dicas

Lance irá mover-se a pilha, saindo assim do método.

Eu recomendo percorrendo seu programa com um depurador, então você vai ver por si mesmo o que está acontecendo. Muito útil para aprender!

Eu vim aqui à procura de uma resposta para o post original e quase perdeu uma resposta muito valiosa postado por Eric Lippert . Aqui está a resposta postada nos comentários:

Dividir este em três questões.

(1) Será que algum do código no método após o lance ser executado?
SIM. Se a exceção foi dentro de um try, em seguida, código blocos catch dentro correspondência ou bloco finally será executado. Se não houver um bloco try então NO. ramos de controlo para o mais próximo que encerram finalmente, captura ou (em v) do bloco de filtro excepção para cima da pilha.

(2) Eu tenho que colocar uma pausa após o lance?
Não, nunca fazer isso. O ponto final da instrução throw não está acessível; um lance é tratado como um goto pelo compilador. Uma declaração imediatamente após um lance não é alcançável e nunca será executado.

(3) Será que um lance, saia sempre do método?
NÃO. Se o lance é em uma tentativa e o try tem um bloco catch correspondente, em seguida, o bloco catch pode "comer" a exceção. Só se não houver nenhum bloco catch faz a exceção fazer um goto não local na pilha de chamada.

Se você tiver mais dúvidas sobre isso, eu recomendo a leitura da especificação C #; todo esse comportamento está claramente documentado.

Finalmente, parece que você está jogando exceções "boneheaded", como em "chamador hey boneheaded, eu lhe disse para não me venha com essa de dados". Isso é ótimo, pois evita erros na chamadores. Mas se você fizer isso, você deve se certificar de que o chamador tem alguma maneira de saber o que você espera! Se o chamador não pode descobrir se você vai jogar ou não com base na sua documentação, então você ainda não fez uma exceção boneheaded, você fez uma exceção irritante. Consulte http://blogs.msdn.com/ericlippert /archive/2008/09/10/vexing-exceptions.aspx para mais detalhes.

Se você já envolto seu código em um try ... catch ... Finalmente bloquear, em seguida, o código sob Finalmente sempre executar. Por exemplo:

Try
  ' do some stuff here
  ' Examine user input
  If user input isn't valid
      Throw new exception
Catch
   Throw ' Just re-throws the same exception
Finally
   ' This code will execute, no matter what - exception or not
End Try

Como um aparte à sua pergunta real: você pode querer repensar o uso de exceções para fornecer informações de validação de volta para o usuário

.

Levantando exceções é caro recurso sábio e lento. Se você tem um número de regras de validação que você precisa aplicar o código específico, em seguida, de gravação para estes -. Você provavelmente deve depender apenas de tratamento de exceções para coisas que você não antecipar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top