Saltar al contenido

Excepciones de lanzamiento y relanzamiento en C#

La excepción de la sección anterior se propaga por la pila de llamadas y como no tenemos un código para capturar y manejar la excepción, se bloquea. Cuando una excepción es capturada, podemos realizar algunas operaciones, como registrar el error, y luego volver a lanzar la excepción. Re-lanzar una excepción significa llamar a la declaración de lanzamiento sin un objeto de excepción, dentro de un bloque de captura. Sólo se puede usar dentro de un bloque de captura.

Vamos a crear una nueva aplicación de consola y actualizar el archivo Program.cs con lo siguiente:

Excepciones de lanzamiento y relanzamiento en C#
Excepciones de lanzamiento y relanzamiento en C#
1234567891011121314151617181920212223242526272829303132333435363738 usando el sistema;namespace MyApp{classProgram{staticvoidMain(string[] args){var calculator =newCalculator(); Console.WriteLine("Enter number");int number =int.Parse(Console.ReadLine()); Console.WriteLine("Enter divisor");int divisor =int. Parse(Console.ReadLine()); Console.WriteLine(calculadora.Divide(número,divisor));}classCalculator{publicintDivide(int número,int divisor){try{retorno número / divisor;}catch(DivideByZeroException){//TODO: log error Console.WriteLine("No se puede dividir por 0");throw;//propage this error}}}}}

csharp

Del código anterior, tenemos una clase de Calculadora con el método de la división. En .NET, cuando un número se divide por 0, lanza el método DivideByZeroException. En el método Divide, tenemos el código para capturar esta excepción, iniciar sesión en la consola y volver a lanzar la excepción. Ejecuta la aplicación e introduce un divisor de 0:

Puedes ver que cuando le pasamos 0 como divisor, imprimió «No se puede dividir por 0» en la consola antes de volver a lanzar la excepción. Noten que el rastro de la pila aún mantenía la información correcta, apuntando a la línea 26 como la línea en la que ocurrió el error, a pesar de que fue relanzada en la línea 32. Un error común que la gente comete cuando intenta volver a lanzar la excepción es llamar a la palabra clave de lanzamiento con el objeto de excepción capturado. Un ejemplo de esto es el siguiente:

123456catch(DividePorCeroExcepción ex){//TODO: error de registro Consola.WriteLine("No se puede dividir por 0");throw ex;//propage este error}

csharp

Si lo hubiéramos implementado de esta manera, imprimiría el siguiente rastro de la pila:

123 Excepción no manejada: Sistema. Dividir por cero: Intentado dividir por cero. en MyApp.Program.Calculator.Divide(número Int32, divisor Int32) en /Users/pmbanugo/Documents/projects/dotnet/MyApp/Program.cs:line 32 en MyApp.Program.Main(String[] args) en /Users/pmbanugo/Documents/projects/dotnet/MyApp/Program.cs:line 17

Se puede ver que apuntaba a la línea 32, la línea donde se lanzó la excepción, en lugar de donde ocurrió. Lanzar una excepción es simplemente llamar a un lanzamiento sin un objeto de excepción.