IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Implémentation d'une gestion globale des erreurs?


Sujet :

ASP.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut Implémentation d'une gestion globale des erreurs?
    Bonjour à tous,

    Je développe une application web en asp.net(visual 2008/framework 3.5/C#) et je souhaite mettre en place une gestion globale des erreurs.
    Je vous explique, à chaque erreur, attrapée dans un Try/catch du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    try
    {
        // My beautiful code in C#
    }
    catch (OracleException ex)
    {
    objErrorHandler.setErrorToDisplay (ex.Message);
    HttpContext.Current.Response.Redirect("~/Views/WebFormError.aspx");
    }
    catch (Exception ex)
    {
    objErrorHandler.setErrorToDisplay (ex.Message);
    HttpContext.Current.Response.Redirect("~/Views/WebFormError.aspx");
    }
    Je veux ré-orienter mon happy-user devant une webform "WebFormError.aspx" avec un message d'erreur dédié et précis l'informant de l'erreur en cours.
    Je pensais créer une classe cErrorHandler (objErrorHandler) qui à tout moment de l'application web qui tourne sur le client est informée du type d'erreur et connait quel message à afficher => cette classe porte l'intelligence de la gestion d'erreur.
    C'est l'objet de cette classe (objErrorHandler) qui vient remplir la webform "WebFormError.aspx" avec les informations qui vont bien.

    En gros, il me faut un objet unique de cette classe par application web qui tourne sur un client.
    Comment la mettre en oeuvre? Je dois faire une classe singleton?
    Comment doit-on s'y prendre pour un cas comme ça?
    Vous pouvez m'aider?
    Comment je code une telle classe?

    Merci mille fois pour votre aide,
    Gaëlle.

  2. #2
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 38
    Points : 50
    Points
    50
    Par défaut
    il ya plusieurs methodes de faire :

    utliser l'evenment Session_start dans global.asax sur l'evenment On_error
    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Exception ex = Server.GetLastError();
    Session["LastError"] = ex;
    Response.Redirect("~/Error.aspx");

    ou creer une classe page generale et surclasser ta methode OnError
    et deriver toutes tes pages de cette classe

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Merci pour ta réponse!

    Session["LastError"] = ex;
    Justement, je me demandais en lisant ce doc très bien fait sur les variables de session et d'application si je pouvais stocker carrément un objet de ma classe cErrorHandler dans une variable de session ?!!
    Est-ce que c'est un des usages des variables de session ou c'est plutôt "sale"?

    Les variables de session sont stockées sur le serveur et sont accessibles par toutes les pages
    web associées à cette session (mais uniquement pour cette session).
    Ca m'arrange bien mais j'ai peur de bouffer un max de CPU sur le serveur en mettant une instance de classe dans une variable de session....même si au max, sur mon site, y'a 3-4 utilisateurs maximums en même temps, vous en pensez quoi?

    Merci encore
    Gaëlle.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut L' héritage en Asp.net pour la gestion d'erreurs
    Je viens de trouver un tuto sur le sujet.
    Ca me semble simple, propre et efficace, je vais implémenter ça dans mon code en C#, vive l'héritage et l'objet \o/
    Et il est vrai que dès que je passe en développement "client léger" en asp.net, j'ai tendance à oublier l'objet, c'est idiot......

    Voilà, hop, je clos mon sujet,
    et encore merci à toi, AghilasB.

    Gaëlle.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Yuna Voir le message
    Ca m'arrange bien mais j'ai peur de bouffer un max de CPU sur le serveur en mettant une instance de classe dans une variable de session....même si au max, sur mon site, y'a 3-4 utilisateurs maximums en même temps, vous en pensez quoi?
    Ben une instance d'objet en session, c'est pas très méchant si l'objet n'est pas gros, et une exception c'est pas très gros en général... Et 3 ou 4 utilisateurs simultanés, c'est rien du tout. Donc je pense pas que les perfs soient un problème...

    Par contre, c'est pas très élégant comme façon de faire... surtout quand il y a un truc prévu pour ça dans le web.config
    http://msdn.microsoft.com/fr-fr/library/h0hfz6fc.aspx

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Merci tomlev pour l'information sur le web.config, je vais creuser ça.
    Pour l'héritage pour la gestion d'erreur en asp.net que je viens d'implémenter, j'ai du mal avec le fait que je doive virer tous mes try/catch du code C# et laisser filer les exceptions jusqu'à la classe de base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class BasePage : System.Web.UI.Page
    {
    	public BasePage()
    	{
     
    	}
     
        protected override void OnError(EventArgs e)
        {
            Exception ex = Server.GetLastError();
            Session["LastError"] = ex;
            Response.Redirect("~/Error.aspx");
        }
    }
    Cette classe va gérer les erreurs mais je trouve ça bizarre de virer les try/catch, vous en pensez quoi?
    En plus, au niveau des objets BDR, j'ai besoin de mes try/catch pour faire mes commit/rollback au niveau de la transaction avec oracle.

    Je suis perplexe, comment gérer au mieux et globalement mes erreurs?

  7. #7
    Membre confirmé
    Avatar de chemanel
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 173
    Points : 457
    Points
    457
    Par défaut
    Les Try/Catch, il vaut mieux les mettre que quand l'erreur que tu risques d'avoir est connue, il faut donc pas en abuser, je pense que le override de OnError est une très bonne solution, sinon tu as aussi un OnError dans Global.aspx, il suffit de l'implémenter une fois à cet endroit.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Chemanel,
    tu évoques le OnError dans Global.aspx, c'est bien celui-ci:
    protected void Application_Error(Object sender, EventArgs e) ?

    Alors, il vaut mieux que je trappe mes erreurs au niveau session ou application au final? C'est quoi le plus propre?
    Vous en pensez quoi?

    Je peux en parallèle modifier le web.config si une erreur passe à travers une maille du filet ? Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <customErrors
           mode="RemoteOnly" 
           defaultRedirect="~/Views/WebFormError.aspx"
    />
    En tout cas, je veux bien suivre tes conseils et virer mes TRY/CATCH mais c'est juste pour objets de cnx à oracle, mon code s'articulait autour d'eux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    using (OracleConnection connection = new OracleConnection())
                    {
                        OracleCommand command = new OracleCommand();
                        if (Open(connection))
                        {
                            // Start a transaction
                            OracleTransaction txn =connection.BeginTransaction(IsolationLevel.ReadCommitted);
                            // Assign transaction object for a pending local transaction
                            command.Transaction = txn;
     
                            try
                            {
                                command.Connection = connection;
                                command.CommandText = queryStr;
                                nbAffected = command.ExecuteNonQuery();
     
                                txn.Commit();
                            }
                            catch (Exception e)
                            {
                                // Rollback the transaction
                                txn.Rollback();
                            }
                            finally
                            {
                                Close(connection);
                            }
                        }
                    }
    Là, je ne vois pas comment m'en passer.....Tu as une idée?

    Bon, je comprends bien mieux la gestion d'erreur en ASP.net, c'est déjà ça
    Résumons un peu, je peux attraper mon erreur au niveau:

    * de la page/session avec l'héritage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class BasePage : System.Web.UI.Page
    {
    	public BasePage()
    	{
    		
    	}
    	
        protected override void OnError(EventArgs e)
        {
            Exception ex = Server.GetLastError();
            Session["LastError"] = ex;
            Response.Redirect("~/Error.aspx");
        }
    }
    * de l'application avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    protected void Application_Error(Object sender, EventArgs e)
    {
      // At this point we have information about the error
      HttpContext ctx = HttpContext.Current;
     
      Exception exception = ctx.Server.GetLastError ();
     ...............
    }
    * de web.config avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <customErrors
           mode="RemoteOnly" 
           defaultRedirect="~/errors/GeneralError.aspx" 
    />

    Bon ben je vais mixer tout ça,
    Merci pour vos conseils à tous,
    Gaëlle.

  9. #9
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut,

    Dans la gestion des erreurs, l'enjeu est la gestion. Il faut se poser les questions suivantes:
    Que doit faire l'application si une erreur se produit?
    L'erreur est-elle grave?
    Ai-je envie d'être informé en tant que technicien (mail, rapports, log en base)?
    L'application doit-elle s'arrêter?
    Que dois-je dire à l'internaute?


    A+

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Par rapport à la réponse d'Immobilis, j'ajoute un point important : l'application est-elle capable de gérer elle-même cette exception ? Si c'est le cas, il n'est pas forcément utile d'indiquer à l'utilisateur qu'une erreur s'est produite, du moment qu'on sait la gérer "proprement".

    La gestion locale des exceptions sert quand on sait gérer une exception spécifique, la gestion "globale" est pour toutes les autres exceptions.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Bonjour et merci pour ces précisions tomlev et immobilis,

    effectivement, je vais me poser les bonnes questions sur mes types d'erreurs et ce que je veux en faire et gérer tout ça.

    Et pour résumer le traitement des erreurs en asp.net, j'ai trouvé cet article technique qui est une bonne synthèse, je trouve, il est en anglais :

    ASP.net custom error pages.

    Merci encore pour échanges très intéressants,
    Bonne journée,

    Gaëlle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion globale des erreurs UncaughtErrorEvent
    Par Garra dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 26/05/2013, 16h35
  2. Gestion globale des erreurs
    Par hubsm dans le forum Services Web
    Réponses: 2
    Dernier message: 03/10/2011, 10h40
  3. Gestion globale des erreurs
    Par claire_S dans le forum Struts 2
    Réponses: 5
    Dernier message: 20/04/2009, 11h24
  4. Réponses: 3
    Dernier message: 21/10/2006, 22h46
  5. Réparer une partition contenant des erreurs
    Par sdx dans le forum Administration système
    Réponses: 4
    Dernier message: 14/06/2005, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo