Come posso sapere quando .Net System.Diagnostics.Process è stato eseguito correttamente o non è riuscito?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sto scrivendo uno scheduler o una specie. È fondamentalmente una tabella con un elenco di ex (come " C: \ a.exe ") e un'app console che controlla i record nella tabella ogni minuto circa ed esegue le attività che non sono ancora state eseguite.

Eseguo le attività in questo modo:

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

Come posso sapere se una determinata attività non è riuscita? Ad esempio, cosa succede se a.exe genera un'eccezione non gestita? Vorrei che il codice precedente sapesse quando ciò accade e aggiorni la tabella delle attività con qualcosa come "l'attività specifica non è riuscita" ecc.

Come posso farlo?

Non sto usando Sql Agent o Windows Scheduler perché qualcun altro mi ha detto di non farlo. Ha più " esperienza " quindi sostanzialmente sto solo seguendo gli ordini. Sentiti libero di suggerire alternative.

È stato utile?

Soluzione

Puoi consultare Win32Exception per verificare se Process.Start () non riuscito a causa del file inesistente o dell'esecuzione dell'accesso è negato.

Ma non puoi intercettare le eccezioni generate dai processi che crei usando questa classe. In primo luogo, l'applicazione potrebbe non essere scritta in .NET, quindi potrebbe non esserci affatto un concetto di eccezione.

Quello che puoi fare è controllare ExitCode dell'applicazione o leggi StandardOutput e StandardError per verificare se i messaggi di errore vengono pubblicati.

Altri suggerimenti

Penso che tu stia cercando Process.ExitCode, supponendo che il processo ne ritorni uno. Tuttavia, potrebbe essere necessario utilizzare WaitForExit (). Esiste anche un evento ErrorDataReceived che viene attivato quando un'app invia a stderr.

Oltre a ExitCode, puoi anche fare qualcosa del genere:

string output = p.StandardOutput.ReadToEnd();

Questo catturerà tutto ciò che sarebbe stato scritto in una finestra di comando. Quindi puoi analizzare quella stringa per motivi noti per la visualizzazione degli errori, a seconda dell'app.

Per espandere ciò che ha detto @jop. Dovrai anche attendere la chiusura del processo. Così:

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

I codici diversi da zero sono in genere errori. Alcune applicazioni usano quelle negative sono errori e quelle positive come codici di stato / avvisi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top