[C#][question lame]Faire une classe de gestion d'erreur

Je suis en train de développer un soft assez complet (pour le taf) et j’essaye de le faire au maximum dans les règles de l’art, art que je maitrise pas tellement en C# (il y a en a ici qui peuvent témoigner :rolleyes: )

Comme le soft est complet et relativement complexe, il y a pas mal d’erreur différentes qui peuvent survenir et j’aimerais reussir a centraliser la gestion des erreurs dans une classe ErrorLog, définie a peu près comme ca:

    class ErrorLog
    {
        protected string LatestError;
        protected string LatestLocation;

        /// <summary>
        /// overload of the class constructor, which allow programmer to define the log mode (1: event log / 2: file)
        /// </summary>
        /// <param name="mode">set the mode either "event log" or "file log"</param>
        /// <param name="destination">if event log is set, specify the name of the event log used, if file log is set, specify the full path of the file</param>
        public ErrorLog(int mode, string destination)
        {

        }

        /// <summary>
        /// Set the LatestError/LatestLocation variables and store this either in a file log or the event log
        /// </summary>
        /// <param name="errorName">the error string provided by the exception</param>
        /// <param name="className">the most precise location where the error occured</param>
        public void LogError(string errorName, string className)
        {
            LatestError = errorName;
            LatestLocation = className;
            //here comes the code to log either in the event log or a file.
        }

        /// <summary>
        /// Get the LatestLocation string
        /// </summary>
        /// <returns>return the LatestLocation string</returns>
        public string GetLatestLocation()
        {
            return LatestLocation;
        }
}

NB: y a pas de code parce que j’ai pas encore fait le code, typiquement il manque des variables de classe pour gérer la destination.
Quant a l’utilisation, ça ressemble a ça:

            //trying to get the tftp file
            try
            {
                TFTPClient t = new TFTPClient(MainData.GWHost);
                //get needs a try/catch to catch the case "no file"
                t.Get(xmlfile, MainData.FileLocalFullPath);
            }
            catch (Exception error)
            {
                ErrorLog err = new ErrorLog();
                err.LogError(error.Message, "MainService/TFTPGetFile");
                return false;
            }

NB 2: les noms des classes sont plus parlant dans le code final.

Et la, on voit que c’est le drame. Dans mon idée d’origine, le choix event log/file log etait en dur dans la classe, mais j’ai trouvé ca debile donc j’ai modifié. Sauf que maintenant, je dois modifier tous les ErrorLog err = new ErrorLog(); en ErrorLog err = new ErrorLog(1,“lame project”); pour que ca envoie dans l’event log a chaque fois, et ca permettrait aussi d’envoyer un coup en event log et un coup en file log…

Uber Naze.

Et j’ajouterais aussi que la méthode public string GetLatestLocation() ne sert absolument a rien puisque l’objet n’existe plus quand je reviens dans la méthode appelante. How lame.

Pour faire quelque chose de propre, avec les connaissances que j’ai de C#, j’entrevoie que deux solutions:
_Créer l’objet Errorlog dans le main et le passer en paramètre a chaque méthode. �?a fonctionne, mais c’est terriblement lourd a mon avis.

_Gérer la gestion des erreurs uniquement avec des throw. Ouais. J’avoue que je maitrise pas bien la notion donc dans l’idéal, je préfère éviter.

En fait, j’aimerais me trouver une 3eme solutions, type “variable globale”: Un objet errorlog est créé dans le main et par la magie d’une bidouille C#, l’objet est disponible dans tous les classes. Mais j’ai pas l’impression que ça soit possible en fait.

Et si quelqu’un ici a une solution 4 qui est “state of the art”, je suis totalement preneur de la solution idéal.

Merci d’avance

LoneWolf
Qui essaye de faire les choses propres dès le début

Je ne réponds pas, volontairement, sur le fond (sinon ça va partir en discussions interminables), mais en tout cas voici déjà une solution à ton point 3 & 4 :

[quote=“LoneWolf, post:1, topic: 52694”]
En fait, j’aimerais me trouver une 3eme solutions, type “variable globale”: Un objet errorlog est créé dans le main et par la magie d’une bidouille C#, l’objet est disponible dans tous les classes. Mais j’ai pas l’impression que ça soit possible en fait.[/quote]

public class ErrorLog
{
  public static ErrorLog Instance { get; set; }

  // [...]
}

public class Program
{
  public static void Main(string[] args)
  {
    ErrorLog.Instance = new ErrorLog();
  }
}

public class MyService
{
  public void Run()
  {
    try
    {
      // [...]
    }
    catch (Exception ex)
    {
      ErrorLog.Instance.Log(ex);
    }
  }
}

Sinon la solution orientée objet pour la variable globale, c’est le pattern singleton. �?a peut aider :slight_smile:

Je me sens obligé de préciser que le pattern singleton peut poser problème et n’est pas à utiliser dans tous les cas :
http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial

Sinon tu re-invente pas la roue et tu regardes:

ici

ou la

etc.

Les components de bases comme ca (logging) ca s’ecrit pas soi meme.

Ah bah j’allais linker SLF aussi. Vala. Reinvente pas la roue, utilise les trucs qui existent. Bienvenue au 21eme siecle.

(Pour le logging, je suis d’accord avec les gens dessus, nlog et Log4net font déjà ça très bien).

doumdoum: pour le coup, vu qu’on parle d’une classe de logging qui n’a pas forcément vocation à être testée, le rapport pratique/emmerdes est assez bas pour faire un singleton.

Edit: je ne connais pas SLF, mais ça a l’air très bien comme solution.