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

C# Discussion :

[C# + XAML] ouvrir le fichier associer à une StackTrace d'un exception


Sujet :

C#

  1. #1
    Membre régulier Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Points : 90
    Points
    90
    Par défaut [C# + XAML] ouvrir le fichier associer à une StackTrace d'un exception
    Hello,

    Voilà le problème :

    J'ai une une exception qui arrive, j'affiche une boite de dialog de mon cru disant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    -------------------------------------------------------
    |
    |  Titre de l'erreur
    |     Raison de l'erreur 
    |            
    |     More info :
    |       Stack Exception
    |         FileNotFoundException :
    |             at company.TestException.throwASystemException() in d:\folder\software\source\testexception.cpp:line 43
    |
    -----------------------------------------------------------
    et j'aimerais que l'on puisse ouvrir le fichier associer à l'exception dans visual studio et si possible à la bonne ligne évidemment... dans ce cas :
    d:\folder\software\source\testexception.cpp:line 43

    Je sais que pour ouvrir un fichier dans l'application qui lui correspond c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.StartInfo.FileName = "d:\\folder\\software\\source\\testexception.cpp";
    proc.Start() ;
    proc.Close();
    Ce qui me manque c'est :
    XAML
    -> je recoit la string de la stack en un bloc, comment je peux avec xaml la parser et mettre un lien sur le chemin du fichier

    C#
    -> y a t il une possibilité de passer la ligne du fichier à ouvrir?
    -> Est il possible de forcer l'ouverture de Visual studio?


    J'espère que je suis assez clair, sinon n'hésitez pas à me demander des précisions...

    Merci déjà à ceux qui m'ont lu jusque là et merci d'avance à ceux qui me répondront ou qui perdront un peu de leur temps à réfléchir à mon problème ^^

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par Thor Tillas
    Ce qui me manque c'est :
    XAML
    -> je recoit la string de la stack en un bloc, comment je peux avec xaml la parser et mettre un lien sur le chemin du fichier
    Etant donné que tu reçois toute la stack, je pense que tu va devoir passer par le code C# pour extraire le lien du fichier de la stack et ensuite, créer (via le code CS) un Hyperlink que tu ajouteras à ta form

    C#
    -> y a t il une possibilité de passer la ligne du fichier à ouvrir?
    Non

    -> Est il possible de forcer l'ouverture de Visual studio?
    Suffit de lancer devenv.exe


    A+

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Question bête: pourquoi ne pas laisser l'exception non gérée, ce qui va ouvrir la petite fenêtre windows proposant de débuguer ? Enfin le truc normal quoi...

  4. #4
    Membre régulier Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Points : 90
    Points
    90
    Par défaut
    oki merci pour toutes ces réponses...

    J'ai réussi à faire quelque chose qui fonctionne. Je le post au cas où quelqu'un en aurais besoin.

    donc voici la string que je recois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    System.IO.FileNotFoundException
       at xxx.Components.ReporterLib.TestException.throwASystemException() in d:\xxx\xxx software\source\components\reporterlib\testexception.cpp:line 43
       at xxx.Components.ReporterLib.TestException.throwADoubleException() in d:\xxx\xxx software\source\components\reporterlib\testexception.cpp:line 30
    System.Exception
       at xxx.Components.ReporterLib.TestException.throwADoubleException() in d:\xxx\xxx software\source\components\reporterlib\testexception.cpp:line 36
       at TestReporterLib.Window1.OnClick(Object sender, EventArgs e) in D:\xxx\xxx Software\Source\Tests\TestReporterLib\Window1.xaml.cs:line 40
    partie intéressante du XAML à ajouter dans votre fenêtre perso(très court... car je ne connais vraiment pas bien cette partie, alors j'essaie toujours de la minimiser ^^)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <TextBlock Style="{StaticResource OptionPaneTitle}">
      Call Stack :
    </TextBlock>
    <TextBlock Name="paragraph" 
                    Style="{StaticResource OptionPaneText}">
     
    </TextBlock>
    partie intéressante du côté C# ce sépare en deux parties. La première se trouve dans la classe partielle qui est couplée à votre XAML... la classe de la window quoi
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    private void BuildLinkedStack(string stackInformation)
        {
          //seperate the stackInformation in a line array
          string[] lineTab = stackInformation.Split('\n');
          //prepare the pattern to find the right part of the line
          //start by " in " followed by the letter of the disk, the path, and finish by a number 
          System.Text.RegularExpressions.Regex regEx = new System.Text.RegularExpressions.Regex(" in [a-zA-Z].*[0-9]", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
     
          //for each line
          foreach (string line in lineTab)
          {
     
            //lineTextBloc.Text = line;
            //if content the pattern " in %c:\" [a-z]:[\\/].*:[0-9]*
            System.Text.RegularExpressions.Match m = regEx.Match(line);
            if (m.Success)
            {
              //get the filename
              string fileAndLine = m.Value.Substring(m.Value.IndexOf(':') - 1);
              string filename = fileAndLine.Remove(fileAndLine.LastIndexOf(':'));
              string lineNumber = fileAndLine.Substring(fileAndLine.LastIndexOf(":line ") + 6);
              //Make an hyperlink on OnFileExceptionClick()
     
              DFHyperlink link = new DFHyperlink();
              link.FileName = filename;
              link.Click += new RoutedEventHandler(OnFileExceptionClick);
              link.Inlines.Add(line);
     
              //add the Hyperlink to the paragraph
              paragraph.Inlines.Add(link);
            }
            else
              // if no match found, just print the line with a "end of line" character
              paragraph.Inlines.Add(line+"\n");
          }
        }
     
        void OnFileExceptionClick(object sender, RoutedEventArgs e)
        {
          DFHyperlink link = (DFHyperlink)sender;
          // start the right process according to the file
          System.Diagnostics.Process.Start(link.FileName);
        }
    Et la deuxième se trouve en dehors, c'est une extension à System.Windows.Document.Hyperlink qui nous permet d'ajouter le nom du fichier à ouvrir
    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
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Documents;
     
    namespace Dartfish.UI.UIHandlerLib
    {
      class DFHyperlink: Hyperlink
      {
        public string FileName
        {
          get 
          { 
            return filename; 
          }
          set
          {
            filename = value;
          }
        }
        //------------------------------------------------------------------------------
        #region Private Members
        private string filename = string.Empty;
     
        #endregion
     
      }
    }
    Et bien sur voici le résultat :





    N'hésitez pas si vous avez des commentaires ou des remarques...


    Pour répondre à la question du
    Question bête: pourquoi ne pas laisser l'exception non gérée, ce qui va ouvrir la petite fenêtre windows proposant de débuguer ? Enfin le truc normal quoi...
    Parce que le but est d'unifier la gestion des erreurs et que les boites de dialogues normales ne me permette pas de faire tout ce que je veux. Je dois donc recréer une nouvelle boite qui sera utilisé au moment du débogage de l'applic mais aussi lorsqu'elle sera déployé pour informer l'utilisateur d'une erreur, lui permettre de reporter l'erreur correctement et d'avoir quelques aides sur comment résoudre son problème sur un lien qui sera contenu dans la boite de dialogue...

    J'espère que ca répond à ta question

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/06/2012, 15h34
  2. Réponses: 5
    Dernier message: 17/01/2007, 12h52
  3. Ouvrir un fichier avec une appli déjà lancée
    Par Cameleon45 dans le forum Langage
    Réponses: 5
    Dernier message: 04/01/2006, 17h42
  4. Réponses: 2
    Dernier message: 02/11/2005, 09h52

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