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 :

Exception + lancement de commande shell


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut Exception + lancement de commande shell
    Bonjour,

    J'ai pas tout tout compris aux exceptions. Voici ce que fait une de mes méthodes :

    scan = Process.Start(@"C:\scanSA.bat", mail + " " + pathFile + " " + pathReport);
    scan.WaitForExit();

    ça marche, mais voilà, je voudrais que si jamais le fichier n'existe pas (la variable 'mail') et que donc le shell mette un truc du genre "le fichier spécifié est introuvable", et bien qu'une exception soit levée. ça sert bien à ça une exception ??
    et au final et bien que ma méthode me retourne true ou false.

    j'ai donc voulu mettre mon code ci dessus dans un bloc try {} et puis après, le catch... j'ai essayé plein de choses (déjà je sais meme pas quel type d' Exception je dois mettre) mais que le fichier existe ou pas, le programme passe toujours dans le bloc try (dans lequel j'ai mis un return true)

    voili voilou... j'espere que je suis a peu près clair... a peu près lol

    merci d'avance

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par remsrock Voir le message
    ça marche, mais voilà, je voudrais que si jamais le fichier n'existe pas (la variable 'mail') et que donc le shell mette un truc du genre "le fichier spécifié est introuvable", et bien qu'une exception soit levée. ça sert bien à ça une exception ??
    Salut,
    ça sert à ça. On peut imaginer que ta méthode lève une exception lorsque le fichier n'existe pas : tu pourrais donc avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void f()
    {
      if (!File.Exists(mail))
        throw new System.IO.FileNotFoundException("le fichier n'existe pas !");
      scan = Process.Start(@"C:\scanSA.bat", mail + " " + pathFile + " " + pathReport);
      scan.WaitForExit();
    }
    Et plus haut dans ton code, dans les méthodes qui appellent cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void g()
    {
    ...
    try
    {
      f();
    }
    catch (System.IO.FileNotFoundException ex)
    {
      // code qui s'exécute lorsque f a lancé l'exception
    }
    Les exceptions sont couramment utilisées en C++, C#, Java entre autres, je t'invite à lire un bon tuto sur le sujet.

    PS : appeler un fichier .bat dans un programme C# est douteux. regarde si tu peux pas traduire et intégrer le contenu de ce batch dans ton code C#...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    Merci de ta réponse, je vois déjà mieux là !

    par contre, pour éviter alors le fichier bat, je pourrais "copier" la commande shell que je fais. mais je n'ai pas trouvé comment on fait, j'ai juste trouvé comment lancer un fichier. car en fait, dans mon .bat, y'a juste une ligne (analyse de SpamAssassin).
    ... donc comment faire ?

    aussi, j'ai des difficultés pour indiquer des chemins, justement exemple : !File.Exists(mail)
    comment indiquer exactement l'endroit où se trouve 'mail' ?

    merci

  4. #4
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Facile : on lance un fichier exe comme on lance un fichier bat, avec Process.Start Regarde la doc de Process : http://msdn.microsoft.com/fr-fr/libr...ss(VS.80).aspx

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    alors du coup, j'essaye de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ProcessStartInfo processInfo = new ProcessStartInfo(@"C:\SpamAssassin\spamassassin.exe");
    processInfo.Arguments = " -D" + " < " + pathFile + mail + " > " + pathReport + mail + ".txt";
     
    Process SAProcess = Process.Start(processInfo);
    SAProcess.WaitForExit();
    mes variables path sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private string pathFile = @"C:\MyWebServices\First\Spam_Files\";
    private string pathReport = @"C:\MyWebServices\First\";
    mais lors du lancement de shell, il dit qu'il n'aime pas les arguments... (le " < "). Je m'y prends sans doute mal, mais je vois pas trop là...

    petite indication quand meme, le lancement de spam assassin se fait par exemple comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    spamassassin.exe -D < "c:\monDossier\test1.htm" > "c:\monDossier\results-test1.htm.txt"

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    < et >, ce sont les Input Output d'un programme en ligne de commande.

    Donc, solution : utiliser les propriétés StandardInput et StandardOutput de la classe process.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    bon la chaleur du bureau ne doit pas aider à la réflexion, mais là je galère à mort !
    je vois pas comment utiliser ces output input, car si le principe est de lancer l'exécutable, en ensuite balancer les autres commandes sur l'entrée standard de la console, quand je teste ça directement dans le shell, ça marche pas. On est obligé de mettre toute la commande sur la meme ligne (comme indiqué dans mon post précédent.

    je commence à regretter mon ptit .bat...

  8. #8
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Si ta solution marche avec un ".bat", t'aurais tort de t'en priver, même si ça n'empêche pas de se documenter sur une façon de faire pur C# C'est vrai que là, StandardInput et StandardOutput sont des flux, donc il il faudrait que tu crées des flux en lecture / écriture sur ton fichier d'entrée et celui de sortie, les filer au process, puis effectivement lancer le process, sauvegarder le flux en écriture, fermer les flux...

    Ce qui est moins simple et plus verbeux qu'un p'tit bat.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    après avoir vu effectivement ce qu'il fallait faire plus ou moins avec les entrée et sorties standards, j'ai repris mon bat... mais bon ca marche plus là (j'aurais du faire une sauvegarde de mon prog !!) mais ça doit etre un truc con que j'ai oublié, je vais trouver.

    mais à cause de toi, utiliser mon bat, ça me gène maintenant !
    bravo !

    donc je répare ma technique bat..man ! et après je vois pour me repencher sur ces input ouput.

    je reviendrais donc vers toi peut etre, merci pour le reste en tout cas !

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    bonjour,

    je voudrais revenir sur les exceptions car je suis en train de les mettre en place. si on prend le cas du fichier qui n'existe pas, on fait un throw new... . ok. mais y a t il un intérêt que ma fonction renvoi un booléen pour savoir si l'action s'est bien passée, ou bien aucun intérêt vu que si ça se passe mal, il y a une exception.
    et donc cela serait plutot ma fonction qui va faire les try qui elle pourrait renvoyer un booléen. (false dans le catch justement)

    merci d'avance...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    bon j'en suis là (mais ma question sur les booléens tient toujours...)

    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
     
    public void scanSA(string mail)
        {
            try
            {
                if (!File.Exists(pathFiles + mail))
                    throw new System.IO.FileNotFoundException("le fichier à analyser n'a pas été trouvé");
                else
                {
                    Process SAProcess = new Process();
                    SAProcess = Process.Start(@"C:\scanSA.bat", mail + " " + "\"" + pathFiles + "\"" + " " + "\"" + pathReports + "\"");
                    SAProcess.WaitForExit();
                }
            }
            catch (System.IO.FileNotFoundException ex)
            {
     
            }
        }
    que puis-je faire dans le catch (si ma méthode est pour l'instante bonne bien sur) ? afficher le message d'erreur défini plus haut ?

  12. #12
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par remsrock Voir le message
    mon dieu c'est pas humain de galérer autant, j'ai vraiment un blocage avec les exceptions. j'ai quand meme compris que t'essaye un bout de code et si ça marche pas, tu lève une exception dans un catch.
    Non, pas dans un catch.
    Exemple :
    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
    public int Diviser (int i1, int i2)
    {
      if (i2 == 0)
        throw DivisionParZéroException();
      return i1 / i2;
    }
     
    // ailleurs dans le code
     
    int a, b;
    int ratio;
    try
    {
      ratio = Diviser(a, b);
    }
    catch (DivisionParZéroException ex)
    {
      // on arrive ici si b == 0
      Console.WriteLine("Erreur : division par zéro !");
    }
    les codes d'erreur en retour des fonction sont la façon de faire des langages qui n'ont pas d'exception. Ca marche si la méthode en question n'a rien d'autre à renvoyer ; mais dans une fonction de division comme celle ci-dessus, faut bien renvoyer i1 / i2, hein
    L'exception est bien plus riche qu'un simple booléen : elle est typée, ça permet de ne ctacher que certains types d'erreurs ; elle contient un message et des tas d'infos sur le contexte de l'erreur ; elle contient la pile des appels, ce qui permet de retrouver d'où vient l'erreur précisément.

    Les exceptions permettent de séparer la logique d'erreur du vrai "coeur" des méthodes. Je suis une méthode, il se passe un truc imprévu ? Je laisse tomber ce que je faisais, je balance un message à mon appelant, qui lui-même l'attrape ou la laisse se propager vers sa propre méthode appelante.

    Je répète ce que j'écrivais ci-dessus : un bon tuto répondra à toutes tes questions.

    [edit] (je viens de voir ton post de 12:13)
    Ca ne sert à rien de lever volontairement une exception dans un try. Enlève le try catch ; ce sera à ta méthode qui appelle scanBidule de gérer cette erreur.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    pour les tutos, c'est ce que je fais, je fais tout avec ça, mais là je sais pas, quand ça veut pas, ça veut pas... ou alors je suis pas tombé sur les bon tutos mais je doute.

    mais en tout cas merci, je pense avoir pigé ! (enfin !)

    par contre, c'est plus le niveau "manipulation" de ces exceptions une fois l'erreur levée où je suis moins à l'aise. dans mon catch, je peux faire afficher le message d'erreur ?

    aussi, comment ça se passe dans ce cas :

    action f
    si le fichier n'existe pas
    throw FileNotFoundException
    sinon
    faire qqchose !
    si le fichier resultat n'existe pas
    throw FileNotFoundException
    sinon
    tout est ok

    ensuite plus loin, je vais appeler mon action dans un bloc try, puis ensuite je vais faire un catch (FileNotFoundException e) ? il va prendre automatiquement la bonne exception en fonction de là où il s'est arrété ?

    stp, me dit pas que mes questions sont betes, et que j'ai encore rien compris

  14. #14
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par remsrock Voir le message
    par contre, c'est plus le niveau "manipulation" de ces exceptions une fois l'erreur levée où je suis moins à l'aise. dans mon catch, je peux faire afficher le message d'erreur ?
    Bah ça dépend de ce que tu veux faire... Ta méthode prend un nom de fichier en entrée, pour l'ouvrir et faire des trucs avec. Le fichier existe pas. Y'a-t-il quelque chose d'intelligent qu'elle puisse faire ? Créer le fichier ? Prendre des valeurs par défaut ? etc.

    Dans ton cas, ta fonction scan est "bas-niveau". Si tu veux coder en couches spécialisées ( ce qui deveint nécessaire quand ton projet prend de l'ampleur), il vaut mieux éviter de mélanger du code qui affiche des messages d'erreur et du code qui veut lire un fichier. Donc tu fais une méthode de pure lecture écriture, qui balance une erreur si pb ; au dessus, une méthode l'appelle et chope l'erreur éventuelle.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    je comprends bien ce que tu veux dire mais là je suis plus dans du test / apprentissage, et donc là de suite, j'ai rien a faire si mon fichier n'existe pas. alors pour être sur que l'exception marche, j'aurai bien aimé que le message d'erreur s'affiche. et donc sur les tutos on marque souvent des trucs du genre Console.Write("Erreur :" + ex.Message). Mais avec mon WS, je vois pas comment on fait.

  16. #16
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    WS = webservice ? Me semble que les webservices gèrent les exceptions. Ça pourrait don être le client de ton WS qui devrait try-catcher l'appel à la WebMethod qui est susceptible de foirer.

Discussions similaires

  1. [Débutant] Problème lancement Acrobat en ligne de commande (shell)
    Par stonnelier dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/01/2015, 15h42
  2. lancement de commande shell en C#
    Par broule dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 30/07/2009, 11h28
  3. Réponses: 4
    Dernier message: 03/10/2008, 15h03
  4. commande shell dans un programme
    Par diefo dans le forum C
    Réponses: 3
    Dernier message: 15/08/2003, 13h37
  5. [VB6] comment savoir si la commande shell est terminée ?
    Par ghyscharlotte dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 30/07/2003, 19h12

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