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 :

[C#] Aide pour la Gestion des erreurs


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 26
    Points : 18
    Points
    18
    Par défaut [C#] Aide pour la Gestion des erreurs
    Bonjour,

    Je suis à la recherche de pistes ou de toute aide pour m'aider à gérer les erreurs. J'ai créé une application ASP.NET qui dialogue avec une base de données (MySql) via le LinqToSQL+DynamicData.

    Un rapide exemple "simplifié" : J'ai des sites de production, auxquels sont rattachés des fours.
    Donc un site peut posséder plusieurs fours et un four ne peut appartenir qu'à un seul site.

    Dans cet exemple simplifié, supprimer des fours ne posera jamais problème, tout comme supprimer des sites où aucun four n'est rattaché. Tenter de supprimer un site possédant au moins un four génèrera une erreur.
    (Description : ...
    Détails de l'exception : ... L'instruction DELETE est en conflit avec la contrainte REFERENCE "FK_FourModele_Site"...
    etc...)
    C'est cette erreur que je souhaite récupérer et interpréter.
    J'ai pris un site avec un four, mais dans mon application il y a également des tubes, des matériaux, des fournisseurs.

    Donc est-il possible de manière générique (ou sinon de créer une page pour chaque erreur, chose plus lourde je pense) de gérer ces erreurs en affichant, par exemple, sur une page "Vous ne pouvez supprimer le Site car il possède un ou plusieurs fours".
    En gros, je me rends compte que c'est le besoin de récupérer l'erreur ou de pouvoir s'en servir.

    Je m'excuse d'être un peu confus car c'est nouveau pour moi.
    Je reste à votre disposition pour vous donner un complémentaire d'informations ^^

  2. #2
    Membre régulier
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 83
    Points
    83
    Par défaut
    Bonjour,

    je te conseille d'utiliser un try et catch pour gérer ce genre d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
    {
        //ta commande de suppression
    }
    catch (SqlException ex)
    {
       //ton code qui affiche un message d'erreur
    }
    ou tu peux aussi de manière générique récupérer toutes les erreurs de la page, faire une redirection vers une page d'erreur et gérer tes erreurs sur cette page. Pour ça il suffit d'utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected void Page_Error(object sender, EventArgs e)
        {
            Exception ex = Server.GetLastError().GetBaseException();
            Session["ex"] = ex;
            Server.ClearError();
            Server.Transfer("~/MaPageDErreur.aspx");
        }
    MaPageDErreur.aspx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected void Page_Load(object sender, EventArgs e)
        {
            Session.Timeout = 480;
            objErr = (Exception)Session["ex"];
            //gestion de l'erreur
            Server.ClearError();
        }
    Bon Code

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Bonjour Pascal,

    Merci pour ta réponse. Voici ce que j'ai fait et obtenu.

    Je suis donc allé sur la page qui gère mes sites de production et j'ai rajouté ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected void Page_Error(object sender, EventArgs e)
        {
            Exception ex = Server.GetLastError().GetBaseException();
            Session["ex"] = ex;
            Server.ClearError();
            Server.Transfer("~/Error.aspx");
        }
    J'ai ensuite créé une page Error.aspx (et donc avec les .aspx.cs et .aspx.design.cs qui vont avec). Et j'y ai collé également ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected void Page_Load(object sender, EventArgs e)
        {
            Session.Timeout = 480;
            objErr = (Exception)Session["ex"];
            //gestion de l'erreur
            Server.ClearError();
        }
    Perfecto, lorsque je souhaite supprimer un site possédant des fours, il me redirige sur la page. Je laisse pour l'instant de côté l'analyse de l'erreur - j'obtiens juste une page avec écrit "erreur".


    Maintenant, je me dis, au lieu de copier ça sur toutes mes pages, il doit bien y avoir un moyen de mettre ça à un endroit pour que ça fonctionne sur toutes mes pages. Première pensée : Global.asax. J'ai donc supprimer PageError(...){...} de ma page Site pour le copier dans le Global.asax(.cs).

    Mauvais raisonnement je pense vu que ça ne marche pas. Aurais-tu (ou quelqu'un d'autre) une idée ?

    Toujours dispo pour donner plus de précisions.

  4. #4
    Membre régulier
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 83
    Points
    83
    Par défaut
    Bonjour,

    Il existe un moyen c'est d'utiliser la méthode
    application_error dans Global.asax.cs et non le page_error
    par contre pour l'instant je n'ai pas réussi a le faire fonctionner,
    donc si ça marche chez toi fait moi signe et je vais essayer de
    le faire chez moi

    Bon Code

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Bon j'ai testé ça de suite et au premier abord ça marche car j'ai également essayé de supprimer un fournisseur de plusieurs tubes et ça m'a redirigé vers la page (alors que je n'avais pas rajouter de Page_Error sur celle du fournisseur).

    J'ai juste changé le Page_Error que tu m'avais précédemment partagé en Application_Error et je l'ai collé dans le Global.asax.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    protected void Application_Error(object sender, EventArgs e)
            {
                Exception ex = Server.GetLastError().GetBaseException();
                Session["ex"] = ex;
                Server.ClearError();
                Server.Transfer("~/Error.aspx");
            }
    Donc j'ai fait plusieurs tests en supprimant des sites, des fournisseurs des matériaux, je suis bien redirigé vers ma page Error. Par contre à un moment, j'ai eu un message de VisualStudio qui me disait pour "Exception ex = Server.GetLastError().GetBaseException();" de mettre new ou quelque chose comme ça. J'ai voulu chercher la cause de l'apparition de ce message, en vain.

    Bon déjà grâce à ton aide, j'arrive à rediriger lorsqu'il y a une erreur (ici conflit lors de la suppression d'éléments). Maintenant il faudrait que je trouve comment interpréter l'erreur... Je vais potasser un peu sur le type "Exception" ^^

  6. #6
    Membre régulier
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 83
    Points
    83
    Par défaut
    Ok, alors je vais aussi essayer de faire comme ça chez moi, car de mettre à chaque fois le page_error n'est pas vraiment super comme solution

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    ^^

    Sinon, dans pour ma page Error, j'ai ajouté dans Error.aspx.cs une variable pour récupérer le message de l'erreur "String errorMessage=objErr.Message;"
    Ce qui me donne au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            protected void Page_Load(object sender, EventArgs e)
            {   
                Session.Timeout = 480;
                Exception objErr = (Exception)Session["ex"];
     
                String errorMessage = objErr.Message;
     
                Server.ClearError();
            }
    Si le raisonnement est bon, comment puis-je l'insérer dans ma page Error.aspx ? Actuellement j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        Erreur
        </div>
        </form>
    </body>
    </html>
    Et dans l'idéal j'aimerais quelque chose comme Erreur : (contenu de la variable errorMessage).

    Merci d'avance de ton (ou de vos) aide(s)

  8. #8
    Membre régulier
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 83
    Points
    83
    Par défaut
    Alors il suffit d'ajouter un label:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <form id="form1" runat="server">
        <div>
           <asp:Label ID="tonLabel" runat="server" Text=""></asp:Label>
        </div>
    </form>
    et ensuite tu rajoute dans ta page Error.aspx.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String errorMessage = objErr.Message;
    tonLabel.Text = errorMessage;

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Attention toutefois aux messages d'erreur affichés directement sur la page, car il se peut dans certains cas que des parties du web.config soient affichées. Si les mots de passe des connection strings, ou si d'autres informations y figurent en clair, cela peut représenter une faille de sécurité importante.

    Pour le debug, cette solution d'afficher les messages d'erreur directement peut-être avantageuse, mais lors de la mise en production, attention à ce qui pourrait s'afficher aux utilisateur

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Merci Matt, je note ça vu que la sécurité des données, faudra bien que je l'aborde !

    Sinon j'avais posté plus tôt :

    Citation Envoyé par Aslan_xD
    Donc j'ai fait plusieurs tests en supprimant des sites, des fournisseurs des matériaux, je suis bien redirigé vers ma page Error. Par contre à un moment, j'ai eu un message de VisualStudio qui me disait pour "Exception ex = Server.GetLastError().GetBaseException();" de mettre new ou quelque chose comme ça. J'ai voulu chercher la cause de l'apparition de ce message, en vain.
    J'ai trouvé d'où venait le masquage de l'erreur : je ne pensais pas à fermer le serveur web de développement lorsque je lançais le débuggage. Donc la première fois j'avais le message d'erreur, puis ensuite il n'apparaissait plus. Maintenant que je pense à le fermer à chaque fois, je vois bien l'erreur qui revient.

    • L'exception NullReferenceException n'a pas été gérée par le code utilisateur
    • La référence d'objet n'est pas définie à une instance d'un objet.
    • Conseil de dépannage : Utilisez le mot clé "new" pour créer une instance d'objet.
    • Conseil de dépannage : Déterminez si l'objet est null avant d'appeler la méthode.
    Je pensais pouvoir le résoudre en changeant le code de cette manière dans le Global.asax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected void Application_Error(object sender, EventArgs e)
            {
     
                Exception ex = new Exception();
     
                ex = Server.GetLastError().GetBaseException();
                Session["ex"] = ex;
                Server.ClearError();
                Server.Transfer("~/Error.aspx");
            }
    Mais que nenni...
    Images attachées Images attachées  

  11. #11
    Membre régulier
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 83
    Points
    83
    Par défaut
    Moi ça fait un moment que j'ai cette solution, mais je n'ai jamais eu cette erreur,

    apparemment quand tu fait Server.GetLastError() il retourne null alors
    quand tu fais .getBaseException() il va te faire ton erreur. Maintenant pour quoi
    Server.GetLastError() retourne null je ne sais pas, si tu essaye de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (Server.GetLastError() != null)
            {
                Exception ex = Server.GetLastError().GetBaseException();
                Session["ex"] = ex;
                Server.ClearError();
                Server.Transfer("~/Error.aspx");
            }
    qu'est-ce qu'il se passe? l'application continue a tourner normalement ou est-ce qu'elle
    plante avec une erreur?

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Sûrement une partie de mon codage qui est foireux, ou la base de données etc...

    En tout cas ça marche J'ai relancé plusieurs fois, en veillant à bien éteindre le serveur web de développement et RAS.

    Merci encore Pascal ^^

  13. #13
    Membre régulier
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 83
    Points
    83
    Par défaut
    Derien

    n'oublie pas de mettre

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

Discussions similaires

  1. [MCD] aide pour MCD gestion des stagiaires dans un bureau d'etude
    Par secondechance dans le forum Schéma
    Réponses: 6
    Dernier message: 06/07/2008, 14h44
  2. Réponses: 12
    Dernier message: 16/08/2007, 23h30
  3. aide pour la gestion des journaux d'évènements
    Par to_toy dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 22/02/2007, 15h20
  4. Gestion des erreurs pour runtime
    Par cbleas dans le forum Runtime
    Réponses: 1
    Dernier message: 09/12/2006, 15h18
  5. Réponses: 6
    Dernier message: 09/06/2006, 13h17

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