Comment savoir quand .Net System.Diagnostics.Process a été exécuté avec succès ou a échoué?

StackOverflow https://stackoverflow.com/questions/155540

  •  03-07-2019
  •  | 
  •  

Question

J'écris un planificateur ou des tris. Il s’agit en gros d’une table avec une liste d’exemples (comme "C: \ a.exe") et d’une application pour console qui examine les enregistrements de la table toutes les minutes environ et exécute les tâches qui n’ont pas encore été exécutées.

J'exécute les tâches comme suit:

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = someExe; // like "a.exe"
p.Start();

Comment savoir si une tâche en particulier a échoué? Par exemple, que se passe-t-il si a.exe lève une exception non gérée? J'aimerais que le code ci-dessus sache quand cela se produit et met à jour le tableau des tâches avec quelque chose comme "La tâche en particulier a échoué" etc.

Comment puis-je faire cela?

Je n'utilise ni l'agent SQL ni le planificateur Windows, car quelqu'un d'autre m'a dit de ne pas le faire. Il a plus d'expérience et d'expérience. donc je ne fais que suivre les ordres. N'hésitez pas à suggérer des alternatives.

Était-ce utile?

La solution

Vous pouvez récupérer la Win32Exception pour vérifier si Process.Start () a échoué en raison de l'absence de fichier ou de l'exécution de l'accès. est refusé.

Mais vous ne pouvez pas intercepter les exceptions émises par les processus que vous avez créés avec cette classe. En premier lieu, il se peut que l’application ne soit pas écrite en .NET et qu’il n’existe donc aucun concept d’exception.

Ce que vous pouvez faire est de vérifier sur le ExitCode de l'application ou lisez le StandardOutput et StandardError pour vérifier si des messages d'erreur sont affichés. sont en cours d'affichage.

Autres conseils

Je pense que vous recherchez Process.ExitCode, en supposant que le processus en renvoie un. Cependant, vous devrez peut-être utiliser WaitForExit (). Il existe également un événement ErrorDataReceived qui est déclenché lorsqu'une application envoie à stderr.

En plus du code de sortie, vous pouvez également faire quelque chose comme ceci:

string output = p.StandardOutput.ReadToEnd();

Cela capturera tout ce qui aurait été écrit dans une fenêtre de commande. Ensuite, vous pouvez analyser cette chaîne selon des modèles connus d'affichage d'erreur, en fonction de l'application.

Pour développer ce que @jop a dit. Vous devrez également attendre que le processus se termine. Ainsi:

        p.Start();
        p.WaitForExit();
        int returnCode = p.ExitCode;

Les codes non nuls sont généralement des erreurs. Certaines applications utilisent des erreurs négatives et des erreurs positives comme codes d’état / avertissements.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top