Matthieu Mezil
L’objet, c’est beau
Le développement orienté objet peut être apparenté, osons le mot, à une forme d’art. Cependant, avant de devenir un « artiste » de l’objet, il y a plusieurs notions à maîtriser. A travers cet article, nous allons en aborder quelques-unes.
Par Matthieu Mezil publié le 27/04/2009 à 07:10, lu 2232 fois, 10 pages
 4 | Gestion des erreurs
En effet, il n’y a aucune gestion d’erreur dans notre programme ce qui est fortement regrettable. Il faut donc corriger ce manque.
Le problème est le suivant : la gestion d’erreur doit se faire dans la couche métier afin de factoriser au maximum le code dans le cas où nous souhaiterions réutiliser notre dll métier avec une autre interface graphique. Le problème est que la couche métier ne sait pas ce qu’il faut faire quand une erreur se produit : afficher un MessageBox, un texte dans la console, dans une page asp, la loguer ?
Ce n’est pas à la couche métier de connaître cela. La couche métier pourrait se contenter de lever des exceptions en cas d’erreur mais il est dommage de lever une exception quand un test simple permettrait de la trouver (le fichier n’existe pas par exemple). De plus, il faudrait dupliquer tous les catch pour chaque UI.
Vu que la seule chose qui diffère est la manière d’afficher l’erreur, nous allons utiliser un délégué.
Pour cela, il faut redéfinir la méthode Transform afin qu’elle prenne en paramètre en plus des paths des fichiers d’entrée et de sortie et du traitement, le délégué permettant d’afficher les messages d’erreurs.
Certaines erreurs permettant à l’utilisateur de réessayer (ex : le fichier est locké), il faudra utiliser deux délégués :
Action<string> showError
Func<string, bool> showErrorWithRetry

public static class FileTransform

{

    public static bool Transform(string inFilePath, string outFilePath, IStringsTransform traitment,

        Action<string> showError, Func<string, bool> showErrorWithRetry)

    {

        if (!File.Exists(inFilePath))

            FileNotFoundShowError(inFilePath, showError);

        else if (!Directory.Exists(Path.GetDirectoryName(outFilePath)))

            DirectoryNotFoundShowError(outFilePath, showError);

        else

            while (true)

            {

                try

                {

                    FileUtil.WriteLines(outFilePath, traitment.Do(FileUtil.GetLines(inFilePath)));

                    return true;

                }

                catch (FileNotFoundException)

                {

                    FileNotFoundShowError(inFilePath, showError);

                }

                catch (DirectoryNotFoundException)

                {

                    DirectoryNotFoundShowError(outFilePath, showError);

                }

                catch (IOException)

                {

                    if (showErrorWithRetry(string.Format(ErrorResources.IOException, outFilePath)))

                        continue;

                }

                catch (Exception ex)

                {

                    showError(string.Format(ErrorResources.FileNotFoundException,

                        string.Concat(ex.GetType(), " : ", ex.Message)));

                }

                break;

            }

        return false;

    }

 

    private static void DirectoryNotFoundShowError(string directoryPath, Action<string> showError)

    {

        showError(string.Format(ErrorResources.DirectoryNotFoundException, Path.GetDirectoryName(directoryPath)));

    }

 

    private static void FileNotFoundShowError(string filePath, Action<string> showError)

    {

        showError(string.Format(ErrorResources.FileNotFoundException, filePath));

    }

}

 
» Démarrer une discussion
 
Discussion démarée par killscores le 28/04/2009 à 17:06, 3 commentaire(s).