web-dev-qa-db-fra.com

Le traitement par lots de Windows prend-il en charge la gestion des exceptions?

La programmation par lots de Windows prend-elle en charge la gestion des exceptions? Sinon, existe-t-il un moyen d'émuler efficacement la gestion des exceptions dans les fichiers de traitement par lots?

Je voudrais pouvoir "lever une exception" n'importe où dans un script batch, à n'importe quel niveau d'appels, et faire sauter la pile d'appels jusqu'à ce qu'elle trouve un "bloc TRY" actif, après quoi un "bloc CATCH" peut gérer l'exception. complètement et continuer, ou faire un peu de nettoyage et continuer à éclater la pile d’APPELS. Si l'exception n'est jamais traitée, le traitement par lots est terminé et le contrôle revient au contexte de ligne de commande avec un message d'erreur.

Il existe déjà quelques couples pour mettre fin au traitement par lots à n'importe quelle profondeur , mais aucune de ces techniques ne permet une activité de nettoyage structurée qui serait normalement fournie dans d'autres langues via la gestion des exceptions.

Remarque:Il s'agit d'un cas où je connais déjà une bonne réponse récemment découverte et que je souhaite partager avec vous

23
dbenham

Eh bien, si le terme "gestion des exceptions" est pris dans le même sens que les autres langages de programmation, je pense que la réponse est: "NON".

Dans tous les langages de programmation standard, le terme "gestion des exceptions" désigne "l'occurrence, pendant le calcul, d'exceptions - conditions anormales ou exceptionnelles nécessitant un traitement spécial", telles que les erreurs d'exécution pouvant être gérées différemment. la gestion des erreurs standard effectuée par le système. 

Par exemple, en C++ : "Les exceptions sont des anomalies d’exécution, telles que la division par zéro, qui nécessitent une prise en charge immédiate lorsque votre programme le rencontre".

Le .NET Framework spécifie: "Les exceptions représentent les erreurs qui se produisent lors de l'exécution de l'application".

Dans Visual Basic 6 : "Visual Basic prend en charge la gestion des exceptions (erreurs), ce qui permet au programme de détecter et éventuellement de récupérer les erreurs pendant l'exécution."

La description JScript indique: "L 'instruction try ... catch ... finally permet de gérer tout ou partie des erreurs pouvant survenir dans un bloc de code donné, tout en exécutant du code".

Dans toutes ces langues, "gestion des exceptions" signifie gestion d'une erreur run-time qui, autrement, causerait l'interruption du programme avec un message d'erreur. Pour ce faire, utilisez la déclaration "try ... catch" de cette manière:

try {
   *any* code 
   that may cause a *run-time ERROR*
}
catch (exception) {
   code that allows to *identify the error*
   testing specific values of "exception"
}

Maintenant, les différences par rapport à l’émulation de code de fichier batch proposée.

Dans un fichier batch, il n'y a que aucun moyen de "gérer" une erreur d'exécution: toutes les erreurs d'exécution entraînent l'arrêt du fichier batch avec un message d'erreur. Dans les fichiers batch, à la différence des autres langues, plusieurs situations non sont signalées comme des "erreurs", mais tout simplement comme le résultat gérable d'une commande. Par exemple, si la commande find ne peut pas trouver la chaîne de recherche, elle renvoie un niveau d'erreur supérieur à zéro, et de manière tout à fait équivalente, si la commande set /A génère une "erreur d'exécution" (comme la division par zéro), il renvoie un niveau d'erreur supérieur à zéro et l'exécution continue normalement. De cette façon, tout programme peut gérer toute situation d'erreur éventuelle signalée de cette manière via le code Batch standard, sans nécessiter de "traitement des exceptions".

Dans la fonction standard "try ... catch", tout code susceptible de produire toute erreur d'exécution peut être placé dans la partie "try" sans autre test; l'exception est automatiquement lancée par le système. L'erreur particulière à l'origine de l'exception peut être identifiée via des tests individuels dans la partie "intercepter". L'émulation proposée par lot est entièrement différente. Dans ce cas, chaque situation "d'erreur" particulière doit être inspectée individuellement dans la partie "try" afin de explicitement renvoyer "l'exception" correspondante; la partie "capture" doit également traiter chacune des exceptions données.

Ce mécanisme ressemble davantage à une autre fonctionnalité des langages de programmation standard: le mécanisme de "gestion des événements" des langages comme C++ qui est également pris en charge via Fonctions de gestion des exceptions Windows . Dans ce schéma, une exception/événement est explicitement levé via la fonction RaiseException, ce qui fait que le thread d'exécution passe à la fonction précédemment enregistrée via AddExceptionHandler.

S'il vous plaît, ne me comprenez pas mal. Je pense que cette méthode est un outil précieux qui peut faciliter la gestion des "erreurs" dans le code Batch de manière simple et puissante. Cependant, je suis en désaccord avec le schéma proposé pour utiliser cette fonctionnalité via la construction "try ... catch" des langages de programmation standard, ce qui donne la fausse impression qu'il est possible d'émuler le mécanisme de gestion des exceptions standard dans les fichiers batch Windows afin d'attraper erreurs d'exécution. À mon humble avis, la méthode deviendrait proche des normes si elle serait basée sur les schémas "RegisterExceptionHandler" et "RaiseException" ...

2
Aacini

l'utilisation de la syntaxe successCmd && ( failingCmd & (call ) ) || ( excHandlingCmd ) est assez pratique dans de nombreux cas et ne nécessite aucun fichier supplémentaire, comme décrit également ici: https://stackoverflow.com/a/17085933/1915920

(le code factice (call ) est seulement pour le cas où la 2ème (dernière) cmd échoue)

0
Andreas Dietrich