Es perfectamente aceptable tener múltiples bloques de captura de diferentes tipos. Sin embargo, el comportamiento es que el primer bloque candidato maneja la excepción.
No entrará AMBOS bloques de captura. El primer bloque de catch que coincida con el tipo de excepción manejará esa excepción específica, y ninguna otra, incluso si se vuelve a lanzar en el controlador. Cualquier subsecuente será omitido una vez que una excepción entre en un bloque catch.
Con el fin de tener una excepción capturada en ambos bloques, que se necesita para cualquiera de los bloques de nido, así:
try
{
try
{
// Do something that throws ArithmeticException
}
catch(ArithmeticException arithException)
{
// This handles the thrown exception....
throw; // Rethrow so the outer handler sees it too
}
}
catch (Exception e)
{
// This gets hit as well, now, since the "inner" block rethrew the exception
}
Como alternativa, puede filtrar en un gestor de excepciones genérico basado en el tipo específico de excepción.
El anidamiento funciona bien para las jerarquías simples de un nivel, pero puede tener problemas si tiene un código compartido que debe ejecutarse para varios casos de excepciones diferentes. Esto no es un desacuerdo con el enfoque, sino una observación de que no siempre es apropiado. – tvanfosson
@tvanfosson: Sí, por eso también agregué la opción de filtrado. Tu opción también es muy buena. –