¿Tengo que romper después de lanzar la excepción?

Estoy escribiendo una clase personalizada en C # y estoy lanzando un par de excepciones si las personas dan las entradas incorrectas en algunos de los métodos. Si se lanza la excepción, ¿se ejecutará alguno de los códigos en el método después del lanzamiento? ¿Tengo que poner un descanso después del lanzamiento, o un lanzamiento siempre abandona el método?

Cuando lanza una excepción, el siguiente código que debe ejecutarse es cualquier bloque catch que cubra esa tirada dentro del método (si existe), luego, el bloque finally (si existe). Puedes tener una oportunidad, una prueba-captura, una prueba-captura-finalmente o una prueba-finalmente. Luego, si la excepción no se maneja, se vuelve a lanzar por un bloque catch o si no se captura, el control se devuelve a la persona que llama. Por ejemplo, obtendrá “Sí1, Sí2, Sí3” de este 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"); 

El tiro se moverá hacia arriba de la stack, y así saldrá del método.

Recomiendo revisar su progtwig con un depurador, luego verá por sí mismo lo que está sucediendo. Muy útil para aprender!

Vine aquí buscando una respuesta a la publicación original y casi me perdí una respuesta muy valiosa publicada por Eric Lippert . Aquí está su respuesta publicada en los comentarios:

Divida esto en tres preguntas.

(1) ¿Se ejecutará alguno de los códigos en el método después del lanzamiento?
SÍ. Si la excepción estaba dentro de un bash, se ejecutará el código dentro de los bloques de captura coincidentes o finalmente el bloque. Si no hay bloque de prueba, entonces NO. Controle las twigs al envolvente más cercano finalmente, capture o (en vb) el filtro de excepción bloquea la stack.

(2) ¿Tengo que poner un descanso después del lanzamiento?
NO, nunca hagas eso. El punto final de la statement de lanzamiento no es alcanzable; un tiro es tratado como un goto por el comstackdor. Una statement inmediatamente después de un lanzamiento no es alcanzable y nunca se ejecutará.

(3) ¿Un lanzamiento siempre abandona el método?
NO. Si el lanzamiento está en un bash y el bash tiene un bloque de captura correspondiente, entonces el bloque de captura puede “comerse” la excepción. Solo si no hay un bloque catch, la excepción hace un salto no local a la stack de llamadas.

Si tiene más preguntas sobre esto, le recomiendo que lea la especificación de C #; Todo este comportamiento está claramente documentado.

Finalmente, suena como si estuvieras lanzando excepciones “con cabeza de hueso”, como en “oye la persona que llama con cabeza de hueso, te dije que nunca me dieras esa información”. Eso es genial porque previene errores en las personas que llaman. ¡Pero si lo hace, debe asegurarse de que la persona que llama tenga alguna forma de saber lo que espera! Si la persona que llama no puede averiguar si va a lanzar o no según su documentación, entonces no ha hecho una excepción de cabeza hueca, ha hecho una excepción desconcertante. Consulte http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx para obtener más información.

Si ha envuelto su código en un bloque Intentar … Atrapar … Finalmente, el código debajo de Finalmente siempre se ejecutará. Por ejemplo:

 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 

Aparte de su pregunta real: es posible que desee volver a pensar en el uso de excepciones para proporcionar información de validación al usuario.

Aumentar las excepciones es costoso en cuanto a recursos y lento. Si tiene una serie de reglas de validación que necesita aplicar, escriba un código específico para ellas; probablemente solo deba confiar en el manejo de excepciones para cosas que no anticipa.