2016-02-09 17 views
6

Quando un'applicazione C# .Net si interrompe a causa di un'eccezione non gestita, ci sono regole che determinano quale codice di uscita viene restituito o è sempre utilizzato?Codice di uscita quando l'eccezione non gestita termina l'esecuzione?

Non sono stato in grado di trovare la documentazione su questo. Una semplice console app che esegue throw new Exception() muore con il codice di uscita 255. Vorrei sapere se è sicuro assumere che tutte le eccezioni non gestite restituiranno lo stesso codice di errore o se ci sono variazioni/casi d'angolo di cui devo essere a conoscenza.

C:\Temp\> ThrowsExceptionConsoleApp.exe 
C:\Temp\> echo %errorlevel% 
255 
+3

Non ho trovato nulla in [ECMA-335] (http://www.ecma-international.org/publications/standards/Ecma-335.htm), quindi suppongo che il codice di uscita del runtime non sia standardizzato per lo scenario di un'eccezione non gestita. – Gene

+1

Hmm, per me su Windows 10.0.14393, 'ECHO% ERRORLEVEL%' output '-532462766'. – binki

risposta

5

No, non sempre. 255 è un numero Unix, normalmente prodotto uscendo con -1, non chiaro come lo hai visto. Su Windows, un processo .NET normalmente esce con il valore del codice di eccezione SEH, quello che ha provocato il crash e la chiusura del processo. Di solito -532462766 (noto anche come 0xE0434352) per un'eccezione gestita. Le ultime 3 coppie esadecano incantesimo "CCR", un acronimo il cui significato è perso nella nebbia del tempo, dichiarato come EXCEPTION_COMPLUS in corexcep.h. Esempio di domanda is here.

Un programma ben educato sottoscrive AppDomain.CurrentDomain.UnhandledException e fornisce un codice di uscita migliore quando chiama Environment.Exit(), come quello prodotto da Marshal.GetHRForException(). Otterrai un codice di uscita che corrisponde al tipo di eccezione gestita, i valori per i tipi di eccezione standard sono documentati nel file SDK CorError.h.


echo %errorlevel% 

E non ha visto che nella domanda prima. % errorlevel% può avere solo un valore compreso tra 0 e 255, una restrizione che risale ai giorni MS-Dos. Dal momento che il codice di eccezione SEH sarà sempre più grande, normalmente vedresti sempre 255. Solo un modo corretto di usare% errorlevel% è di supporre che il programma non sia riuscito quando non è 0. A meno che tu non abbia una documentazione specifica dall'autore del programma.

+2

Sembra che la limitazione sia stata revocata a volte perché in Windows 10.0.14393 ho ottenuto '-532462766' per' ECHO% ERRORLEVEL% '. – binki