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

VBScript Discussion :

ERRORLEVEL 0 quand le script sort en erreur !


Sujet :

VBScript

  1. #1
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut ERRORLEVEL 0 quand le script sort en erreur !
    Bonjour,

    Je fais un scrip assez complexe en VBS. Je voudrais etre averti quand se script sort en erreure non prévue. Pour cela, je compte sur la valeur ERRORLEVEL qui est retournée par le script en fin d'exécution.

    Je voudrais, en fin de script, sortir sur 0 (pas d'erreur) à l'aide de "WScript.Quit (0)". Mon problème c'est que quand le script se plante en cours d'exécution pour une raison quelquonque, il sort, par défaut avec le code 0.

    Je trouve ce comportement un peu idiot puisque ce code veut dire normalement que le script s'est terminé normalement...

    Je me demande donc si quelque-chose ne m'échape pas et si il y a un moyen de dire au script de sortir avec le code 1 si il rencontre une erreure non gérée.

    J'espere avoir été assez explicite, merci.

  2. #2
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    tout betement tu n'aurais pas un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    On Error Resume Next
    qui traine qquepart ?

  3. #3
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    J'ai testé ce comportement dans un programme minimaliste de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Dim i
    'Je génère volontairement une erreur
    i = 10 /0
    WScript.echo "test"
    WScript.Quit (0)
    Ce script sort avec ERRORLEVEL = 0 soit pas d'erreur...

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Au contraire, moi je laisserais le On Resume Next Error et je gérerais les erreurs moi-même et à chaque fois que je décourvrirais une erreur le pourrais faire un WScript.Quit("ce que je veux").

  5. #5
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    On parle ici d'un script de plus de 1800 lignes qui accède à des bases de données et fichiers de config. Les causes possibles d'erreur sont très nombreuses !
    Avec la gestion plus que laborieuse des erreurs avec VBS, je ne vais surement pas m'amuser à imaginer tous les cas possibles. Du coup, je voudrais simplement savoir quand mon programme ne s'est pas terminé normalement.

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    tu n'as pas besoin d'imaginer les erreurs.
    En vbs les erreurs sont stockés dans l'objet err.
    Moi en général ce que je fait c'est la construction d'un fichier log avec les données de l'objets. Mais à la place tu peut faire un quit avec la valeur que tu veux, genre la valeur d'une propriété err.

  7. #7
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    qquechose comme ca ?

    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
     
    Option Explicit
     
    Dim i
    'Je génère volontairement une erreur
     
    on error resume next
     
    i = 10 /0
     
    If Err <> 0 then 
       msgbox "Erreur : " & err & " y a une erreur"
    else
       msgbox "y en a pas"
    end If 
     
    WScript.Quit

  8. #8
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Ce que je veu dire c'est que si je suit votre logique, il va faloire que je vérifie la valeur de l'objet err au moins 100 fois dans mon script qui est déja suffisement lourd. Je ne tiens pas à faire ca et en plus ca ne m'apportera pas grand chose de plus. Tout ce que je voudrais c'est que mon script sorte avec 1 si il plante et 0 dans les autres cas.

    Existe-t-il un moyens de faire ca ?

  9. #9
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    Pas forcement, tu testes si err = 0 ou 1 juste avant la fin de ton script.

    Après si tu veux, tout arreter dès qu'une erreur apparait sans ajouter des If ... et sans que le reste s'execute c'est une autre paire de manches, je ne sais pas faire.

    A++

  10. #10
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    C'est effectivement la deuxième solution qui m'interesse. La première ne me convient pas puisque je ne sait plus ce que le programme insert dans mes BDD...

    Domage mais merci pour ton aide.

  11. #11
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Heu... Je ne pense pas que ton script de 1800 lignes tienne dans une seule sub, je ne suis pas sur que cela soit si long.
    Cela fait un peu de temps que je n'ai pas fait de vbs mais si je ne me trompe pas, si tu ne met pas on resume next error dans une fonction appelé, la fonction ne se termine pas, mais l'erreur n'est pas remise à zéro et la fonction appelante reprends la main et s'il elle a la fameuse option, le reste du code est interprété, sinon il n'est plus interprété.

  12. #12
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Taille du script : 1803 lignes (je l'ai alégé...)
    Méthodes : 21 + le main

    Si tu met un "on error resume next" dans la méthode appelante, son effet se propage dans la méthode appelée.

    Si tu le met dans la méthode appélée, son effet prend fin quand tu en sort.

  13. #13
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Bon alors c'est simple, si tu veux qu'une exception te saute à la figure lorsque ton vbs plante, il ne faut pas de On Error Resume Next.
    Si dans ce cas en cas d'erreur , la valeur de retour en vbs est toujours 0, tu ne va pas pouvoir faire grand chose.
    Je suis certain par contre que err passe de 0 à une certaine valeur lorsqu'il y a une erreur. Pour la renvoyer tu as besoin de la fonction quit, de la valeur de err, et donc de On Error Resume Next...

    Maintenant il existe d'autre façon d'opérer .
    On Error Resume Next n'est qu'une suite mot clé, et il existe d'autre truc comme On Error Go To, qui à mon avis peut t'aider à faire ce que tu souhaites .

    En faisant une recherche rapide (< 5 min) su google avec l'expression "On Error Resume Next", je suis tombé sur un tutorial de gestionnaire d'erreur en VB de developpez.com .
    Voici le lien :
    http://www.developpez.com/vbasic/tut...tutoriel16.php

    Juste pour en revenir sur l'objet err, je trouve qu'il est très pratique (moins que les exceptions), sur un script de 1200 lignes (j'ai vu que tu aimais signalé la taille de ton script) que j'ai crée, je l'ai constament utilisé, et je peut ainsi parfaitement gérer mes erreurs, principalement je les logs dans un fichier log.
    mais je pourrais aussi nétoyer le bazzare que j'ai mis sur la machine, enfin si j'en mettais.
    Imagine toi, tu modifies une table d'un BD, tu commences à faire des insert, et puis la boum une exception te petes à la figure, ton script s'arrête, et ta BD est corrompue . Avec une gestion des erreurs, tu pourrais nettoyer la dernière entrée dans ta BD en cas d'exception .

  14. #14
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Malheuresement, il s'agit de VBS et non de VB.
    Le "on error goto x" facilite en effet les choses mais il ne fonctionne pas en VBS.

    Tout ce que j'ai trouvé comme comportement face aux erreurs c'est "on error goto 0" et "on error goto next"

  15. #15
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Desole, je viens de trouver le code, je suis etonné que vbs ne l'implémente pas, mais bon, je viens de vérifier sur un autre site que il n'y a bien que On error resume next et On error goto 0.
    Bah dans ce cas là pas de solution miracle, tu va devoir gérer toi même les erreurs.
    Ou intercepter l'événement qui amène la génération de la pop up d'exception windows, mais je ne suis pas sur que cela soit plus court .

    En même temps, en revoyant ton code je me pose une question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Dim i
    'Je génère volontairement une erreur
    i = 10 /0
    WScript.echo "test"
    WScript.Quit (0)
    Avec WScript.Quit (1) ne te renvois t il pas autre chose que 0 ?
    Ou alors il n'est jamais senser arriver au WScript.Quit (0) à cause de l'erreur ?
    As tu testé ?

  16. #16
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    Entierement d'accord là dessus avec CED600 sur ce point :

    Citation Envoyé par ced600 Voir le message

    mais je pourrais aussi nétoyer le bazzare que j'ai mis sur la machine, enfin si j'en mettais.
    Imagine toi, tu modifies une table d'un BD, tu commences à faire des insert, et puis la boum une exception te petes à la figure, ton script s'arrête, et ta BD est corrompue . Avec une gestion des erreurs, tu pourrais nettoyer la dernière entrée dans ta BD en cas d'exception .
    J'imagine que ton appli est suffisamment sensible au niveau de la cohérence des données pour que tu puisses rajouter quelques If err <> 0 aux points critiques. C'est sur qu'aujourd'hui tu vas perdre un peu de temps à rédiger du code, par contre le jour ou ca plantera vraiment tu sauras faire marche arriere pour la cohérence de tes datas.

    enfin c'est comme ca que je ferai...

    A++

  17. #17
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Si tu écris
    il est normal que ton ERRORLEVEL soit 0.
    Débrouille-toi pour passer une valeur significative dans le Quit.
    Cette valeur sera renvoyée au ERRORLEVEL.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  18. #18
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    C'est bon, j'ai trouvé. En fait je fesait erreur sur la propagation du "on error resume next" dans une fonction appelée. ced600 avait raison (si j'ai bien compris ce qu'il voulait dire). Un exemple vaut mieux qu'un long discours alors voici mon exemple trivial du début modifié pour fonctionner comme je le désire :
    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
    Option Explicit
    on error resume next
     
    Call Programme
     
    If Err.Number <> 0 then 
    	Wscript.echo("Une erreure s'est produite")
    	WScript.Quit(1)
    Else
    	Wscript.echo("Le script s'est terminé normalement")
    	WScript.Quit(0)
    End If
     
    Sub Programme()
    	Dim i
    	Wscript.echo("Je génère volontairement une erreur")
    	i = 10 /0
    	Wscript.echo("Ne s'affichera jamais")
    End Sub
    Le principe est donc de déplacer tout le code dans une méthode. En fait, si une erreure se produit dans cette méthode, l'éxecution de cette dernière va s'interompre et rendre la main à la méthode appelante (ici, le main). On peut alors sortir en erreure si nécessaire.

    Merci pour votre aide.

  19. #19
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    pour le "fun" tu pourrai même changer le
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WScript.Quit(Err.Number)
    de façon à avoir le numéro d'erreur disponible à l'extérieur du vbs..

  20. #20
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Oui, dans mon programme réel, j'inscrit aussi l'erreur dans les fichiers de log.
    D'ailleur, est-il possible de récupérer le numéro de la ligne à laquelle s'est produit l'erreure ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [CMake] NMake sort une erreur de liaison
    Par khazna dans le forum Systèmes de compilation
    Réponses: 1
    Dernier message: 02/05/2010, 14h47
  2. Empêcher l'arrêt d'un script suite à une erreur
    Par ProgVal dans le forum Langage
    Réponses: 12
    Dernier message: 02/11/2009, 15h30
  3. [DOM] Internet Explorer me sort une 'Erreur : Objet Requis' :/
    Par VilainMelkor dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/11/2008, 12h42
  4. Réponses: 8
    Dernier message: 05/02/2008, 11h35
  5. [Script] désactiver les erreurs E_STRICT
    Par jeanvincent dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 17/10/2005, 14h33

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