A veces puede ser beneficioso envolver la excepción original en un nuevo tipo de excepción y luego lanzar ese nuevo tipo de excepción. Esto nos permite esencialmente cambiar el nuevo tipo de excepción que se propaga por la pila de llamadas. Este cambio puede ayudar a aclarar la excepción a la aplicación de nivel superior si no es explícito para que el bloque de llamada de nivel superior lo maneje. Una aplicación útil de esto es que si está desarrollando una biblioteca para que la usen otros programadores, su biblioteca podría funcionar con algún código de bajo nivel, cuyas excepciones encontradas en el código de bajo nivel podrían ser difíciles de manejar para los usuarios de la biblioteca. En ese caso, podemos captar las excepciones que se producen al realizar estas operaciones de bajo nivel y envolverlas en una excepción personalizada o en algún otro tipo de excepción que los usuarios de la biblioteca o el código de nivel superior puedan comprender y manejar.
Siguiendo con nuestro ejemplo anterior, supongamos que decidimos que la excepción de dividir por cero no es lo suficientemente explícita para que la manejemos, podemos envolverla en una excepción diferente y propagarla en la pila de llamadas. Actualicemos Program.cs con el siguiente código:
1234567891011121314151617181920212223242526272829303132333435363738394041424344 usando el sistema;namespace MyApp{classProgram{staticvoidMain(string[] args){var calculator =newCalculator(); Consola. WriteLine("Introducir número");int número =int.Parse(Console.ReadLine()); Console.WriteLine("Introducir divisor");int divisor =int.Parse(Console.ReadLine());try{ calculator. Divide(número, divisor);}catch(ArithmeticException ex){ Console.WriteLine("Oh no, algo está mal"); Console. WriteLine(ex);}}classCalculator{publicintDivide(int número,int divisor){trata{regresar número / divisor;}catch(DivideByZeroException ex){//propagar este error arrojandoArithmeticException("No se puede dividir por 0. Por favor, use un número diferente como divisor", ex);}}}
csharp
A partir del código anterior, cambiamos el bloque de captura en la línea 21 para manejar el tipo de excepción de AritméticaExcepción. Envolvimos la operación de división, dentro del método Divide, en un bloque de prueba y captura. Dentro del bloque de captura es donde atrapamos el tipo de excepción DivideByZeroException y lo envolvimos dentro del tipo ArithmeticException. La excepción de envoltura simplemente implica establecer la propiedad InnerException de la nueva excepción para propagar la pila de llamadas, a la excepción capturada. Haciendo esto se mantiene la información de la pila de llamadas de la excepción.
Ejecute la aplicación e introduzca un divisor de cero cuando se le pida. Debe imprimir lo siguiente cuando se lanza la excepción:
Puedes ver que la excepción atrapada fue la excepción aritmética y tenía el mensaje de error definido. La información de la pila de llamadas apuntaba a la línea 34, donde encontró el error.