Code Tip: Extrae los bloques Try/Catch en su propia función

jueves, 18 de junio de 2015


Los bloques Try/Catch son utilizados en lenguajes como Java y C# para manejar excepciones, el problema que suelen tener es que ensucian el código no pudiendo ver claramente el código real del que controla la excepción, vamos a ver como podemos extraer la gestión de errorres en una función dejando el código mucho mas limpio y legible. Veamos este ejemplo código extraido de la MSDN que he modificado para el artículo.

public void CreateFile(string path, string content)
{
    try
    {
        if (File.Exists(path))
        {
            File.Delete(path);
        }

        using (FileStream fs = File.Create(path))
        {
            Byte[] info = new UTF8Encoding(true).GetBytes(content);
            
            fs.Write(info, 0, info.Length);
        }
    }

    catch (Exception ex)
    {
        _logger.Error("A Error has ocurred creating file", ex);
    }
}


En el mismo método crea el fichero y también maneja la excepción, esto tiene varios problemas:

Ensucia el código, esta mezclado el manejo de la excepción con la creación del fichero, además la función se esta encargando de dos cosas y las funciones quedan más limpias cuando se encargan de solo una cosa, en caso de tener que hacer varias cosas, es mejor dividir en pequeñas funciones para una mejor legibilidad del código. En este caso la mejor solución es crear una función que se encargue solo de crear el fichero y otra que invoca a esta y además realiza el manejo de la excepción.

public void CreateFile(string path, string content)
{
    try
    {
        CreateFileDeleteIfExists(path, content);
    }

    catch (Exception ex)
    {
        _logger.Error("A Error has ocurred creating the file", ex);
    }
}

public void CreateFileDeleteIfExists(string path, string content)
{
    if (File.Exists(path))
    {
        File.Delete(path);
    }

    using (FileStream fs = File.Create(path))
    {
        Byte[] info = new UTF8Encoding(true).GetBytes(content);
        
        fs.Write(info, 0, info.Length);
    }
}


Concusiones

Los bloques Try/Catch es recomensable extraerlos en su propia función añadiendo así una mejor legibilidad al código y creando dos funciones, cada una con una funcionalidad concreta, una para el manejo de excepciones y otra con la funcionalidad principal.

No hay comentarios:

Publicar un comentario