EDITAR: Estoy de acuerdo con otros que dicen que, a partir de C # 6.0, los filtros de excepción ahora son una forma perfecta de hacerlo:catch (Exception ex) when (ex is ... || ex is ... )
Excepto que todavía odio el diseño de una línea larga y personalmente presentaría el código de la siguiente manera. Creo que esto es tan funcional como estético, ya que creo que mejora la comprensión. Algunos pueden estar en desacuerdo:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
ORIGINAL:
Sé que llego un poco tarde a la fiesta aquí, pero humo santo ...
Pasando directamente a la persecución, este tipo de duplica una respuesta anterior, pero si realmente desea realizar una acción común para varios tipos de excepción y mantener todo ordenado y ordenado dentro del alcance de un método, ¿por qué no usar una lambda? / cierre / función en línea para hacer algo como lo siguiente? Quiero decir, es muy probable que termines dándote cuenta de que solo quieres que ese cierre sea un método separado que puedas utilizar en todo el lugar. Pero entonces será muy fácil hacerlo sin cambiar realmente el resto del código estructuralmente. ¿Derecha?
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
No puedo evitar preguntarme ( advertencia: un poco de ironía / sarcasmo por delante) por qué hacer todo este esfuerzo para reemplazar básicamente lo siguiente:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
... con alguna variación loca de este próximo código de olor, quiero decir ejemplo, solo para fingir que estás guardando algunas teclas.
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
Porque ciertamente no es automáticamente más legible.
Por supuesto, dejé las tres instancias idénticas /* write to a log, whatever... */ return;
del primer ejemplo.
Pero ese es mi punto. Ustedes han oído hablar de funciones / métodos, ¿verdad? Seriamente. Escriba una ErrorHandler
función común y, como, llámela desde cada bloque catch.
Si me pregunta, el segundo ejemplo (con las palabras clave if
y is
) es significativamente menos legible y, al mismo tiempo, significativamente más propenso a errores durante la fase de mantenimiento de su proyecto.
La fase de mantenimiento, para cualquiera que sea relativamente nuevo en la programación, comprenderá el 98.7% o más de la vida útil general de su proyecto, y el pobre imbécil que hace el mantenimiento seguramente será alguien más que usted. Y es muy probable que pasen el 50% de su tiempo en el trabajo maldiciendo su nombre.
Y, por supuesto, FxCop te ladra, por lo que también debes agregar un atributo a tu código que tenga que ver exactamente con el programa en ejecución, y solo está ahí para decirle a FxCop que ignore un problema que en el 99.9% de los casos es totalmente correcto en marcar. Y, lo siento, podría estar equivocado, pero ¿ese atributo de "ignorar" no termina realmente compilado en su aplicación?
¿Poner la if
prueba completa en una línea la haría más legible? No lo creo. Quiero decir, hace mucho tiempo que otro programador argumentó con vehemencia que poner más código en una línea lo haría "correr más rápido". Pero, por supuesto, estaba completamente loco. Tratando de explicarle (con una cara seria, lo cual fue un desafío) cómo el intérprete o el compilador dividiría esa larga línea en declaraciones discretas de una instrucción por línea, esencialmente idénticas al resultado si hubiera seguido adelante y solo hizo que el código fuera legible en lugar de tratar de superar al compilador, no tuvo ningún efecto en él. Pero yo divago.
¿Cuánto menos legible es esto cuando agrega tres tipos de excepción más, dentro de un mes o dos? (Respuesta: se vuelve mucho menos legible).
Uno de los puntos principales, realmente, es que la mayoría del punto de formatear el código fuente textual que todos estamos viendo todos los días es hacer que sea realmente obvio para otros seres humanos lo que realmente sucede cuando se ejecuta el código. Debido a que el compilador convierte el código fuente en algo totalmente diferente y no podría importarle menos su estilo de formato de código. Así que todo en una línea también apesta totalmente.
Solo digo...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}