Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=01d191ae-508f-4ee2-9c15-f08cf9c3b458

¿Qué son los filtros de excepciones en el lenguaje C#?

Los filtros de excepciones son una característica de la gestión de errores de .NET que han estado disponibles en el framework desde siempre. Los programadores de VB.NET han tenido acceso a ellos también desde el origen de los tiempos, pero los "sufridos" programadores de C# se tenían que conformar con simularlos de manera chapucera. No fue hasta la aparición de C# 6.0, allá por el verano de 2015, que los programadores de C# le pudieron sacar partido a esta útil característica por primera vez.

Un filtro de excepciones lo que nos permite es establecer una cláusula catch específica no solo para un tipo de excepción concreta, sino también filtrando la excepción según algunas condiciones adicionales sobre la misma.

Vamos a verlo con un ejemplo concreto.

Imagínate que estás haciendo una pequeña rutina que llama a una página web para obtener su contenido. Si todo va bien devuelve el contenido de la página, pero si se produce algún fallo devuelve un texto corto descriptivo de lo que ha pasado. Cosas como, por ejemplo, "Página no encontrada" si no la encuentra y por lo tanto se devuelve un estatus HTTP 404, "Permisos de acceso denegado" si  se obtiene un 403, o "Se ha producido un error interno" en caso de un código de estado 500, etc...

En un código C# normal anterior a C# 6.0, lo que debería escribir es algo similar a esto (un poco más cuidado, pero así se "pilla" la idea):

public static string DescargaPagina(string url)
{
    try
    {
        WebClient wc = new WebClient();
        return wc.DownloadString(url);
    }
    catch(WebException wex)
    {
        if (wex.Message.Contains("(404)"))
            return "Página no encontrada";
        else if (wex.Message.Contains("(403)"))
            return "Permiso denegado";
        else if (wex.Message.Contains("(500)"))
            return "Se ha producido un error interno en la web solicitada";
        else
            return "Se ha producido un error: " + wex.Message;
    }
    catch(Exception ex)
    {
        return "Se ha producido un error: " + ex.Message;
    }
}

Fíjate en cómo puedo especificar un gestor de excepciones distinto según el tipo de excepción, pero que luego tengo que estar con un montón de condicionales para devolver un mensaje diferente según el código de error que viene en el mensaje. Por supuesto podría haber usado un switch y una expresión regular, o cualquier otra técnica un poco más elaborada para conseguir lo mismo, pero la idea es que tengo que hacerlo dentro del gestor de la excepción.

¿Cómo podría mejorarlo usando filtros de excepciones?

Pues gracias a la palabra clave when que me permite generar diferentes elementos catch con condiciones adicionales de filtro. Lo mejor es verlo en acción porque se entiende muy fácilmente.

El código equivalente al anterior, pero con filtros de excepciones sería el siguiente:

public static string DescargaPagina(string url)
{
    try
    {
        WebClient wc = new WebClient();
        return wc.DownloadString(url);
    }
    catch (WebException wex) when (wex.Message.Contains("(404)"))
    {
        return "Página no encontrada";
    }
    catch (WebException wex) when (wex.Message.Contains("(403)"))
    {
        return "Permiso denegado";
    }
    catch (WebException wex) when (wex.Message.Contains("(500)"))
    {
        return "Se ha producido un error interno en la web solicitada";
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}

Fíjate que ahora el código es mucho más claro y directo. Gracias a when podemos especificar condiciones más o menos complejas que nos interesen para filtrar cada excepción. Ahora para capturarla en un catch concreto no solo llega con que el tipo de excepción sea el que indicamos, sino que además debe cumplirse la condición que establezcamos en el when.

De este modo podemos tener código más claro y mejor gestionado. No deja de ser "azúcar sintáctico" pero la gente de VB.NET lleva disfrutándolo desde hace 3 lustros, e incluso los de F# lo tenían desde su versión 1.0. Ya era hora de que estuviese disponible en C# también :-)

Te puedes descargar el código de ejemplo para Visual Studio 2015 o posterior desde aquí (ZIP, 4KB)

¡Espero que te resulte útil!

Fecha de publicación:
José Manuel Alarcón Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José Manuel Alarcón
Archivado en: Lenguajes y plataformas

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (1) -

Wilberth Frias
Wilberth Frias

Me parece un artículo muy interesante, como mencionas, se hace más legible el código y directo.

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.