2015-09-12 26 views
13

終了する前に.netプログラムが明示的に終了コードを設定することができない場合(Environment.Exit()/Appliation.Current.Shutdown()/...を呼び出して)、そのプロセスの終了コードは何ですか?Environment.Exit()が使用されていないときに、.netプログラムが持つ終了コードはどれですか?

正常終了は常に終了コードゼロとなりますが、その他の可能性のあるケースは何ですか?

はハンスアンパッサンによる関連質問Getting ExitCode From Exception Handlerthis answerによると:「プログラムが例外で死ぬ場合その終了コードは、基礎となる例外エラーコードとして通常同じです」。

したがって、例外を除いて、終了コードを使用することができます。このは常にの場合で、基本的な例外エラーコードであるは、とは異なり、特定の範囲で常に保証されますか?

.netフレームワークまたはWindowsが、例外ではないクラッシュ(それは可能ですか?)や強制的なタスクの強制終了など、別の終了コードを自動的に設定できる状況がありますか?

別の言い方をすれば、プログラムが異常な方法で終了したかどうかを終了コードで判断できますか?
また、いくつかの異常なケースでも終了コード0が発生する可能性がある場合は、プログラムのすべての通常の終了パスにEnvironment.Exit(somevalue)を含めることができますか?そして、この終了コードはクラッシュ時には発生しないことを確認しますか?


動機づけ:重度の回避策せずnot all exeptions are catchableので
、およびすべてのコードパスがEnvironment.Exit()はalwas不可能である呼び出すことを確認して、キャッチされないexcpetions以外の突然のプログラム終了のための他の原因があるかもしれないからです。このため、プログラムが正常に終了したかどうかを確実に判断するために終了コードを使用できるかどうかを判断することに興味があります。

+0

私は私の質問と提案された複製との違いを加えました。 2番目の答えはまた私の質問の一部に役立ちますが、それは完全にそれに答えるものではなく、質問自体は全く異なります。 – HugoRune

+0

Tangental suggestion:Windowsエラー報告を有効にし、ミニダンプを有効にするオプションを有効にします。こうすることで、終了コードだけでなく、デバッガを通過できる例外レコードと部分スタックも取得できます。 (WinDBGのように、SOSデバッガを使用します。)ミニダンプを使用しなくても、WERはエラーメッセージ自体に関する情報を取得します。内部アプリケーションの場合、クラッシュレポートが自動的に送信されるようにサーバーを設定することもできます。 TechNetの[ページ](https://technet.microsoft.com/en-us/library/cc709644.aspx)には概要があります。 – theB

+0

終了コードはかなり役に立たないIMHOです。その他の情報:http://stackoverflow.com/questions/4344923/process-exit-code-when-process-is-killed-forcibly –

答えて

5

その終了コードは、6ヶ月後に根本的な例外エラーコード

として通常同じである、あなたは通常が適用されることにいくつかの信頼を築いてきたはずです。多分うまくいきました、あなたはここで保証を得ることができません。プロセスを終了させるのは処理されない例外ではなく、プロセスが例外で終了したときに実行されるコードと常に同じコードであることを決して確認することはできません。

これに関与したいと思っているものがあまりにも多くあり、常に最高の品質であるとは限りません。リストの上には確かにアンチマルウェアがあります。そこにはたくさんのcr * pwareがあり、あなたはあなたが何を踏襲しているかを決して知らないでしょう。最近のAvastの災害には、これを心配する理由がたくさんあります。それが終わるところではなく、WERに取って代わるユーティリティが十分に一般的です。

あなたは、TerminateProcess()がファイルロックの問題を解決する良い方法だと思うyokelに対して完全に無防備です。または電源コードを踏んで機械を抜く。

には、なぜの終了コードを知りたいのですか。プログラムの結果を使用して実行を続行する、次に行うべきことがあるはずです。結果を検証する。

2

自分で実行しているプロセスはありますか?つまり、予測可能な状況下で終了コードを制御できますか? もしスローされた例外をキャッチして、予測可能な非ゼロ例外コード(特定の値または独自の範囲)を返すことができます。システムエラーコードが正であるため、負の数を使用します。 次の3つの可能性持ってその方法:

  1. ゼロ - 成功
  2. マイナス - プロセスは、あなたが
  3. 正をキャッチすることができました、例外を投げた - プロセスは、あなたがキャッチできなかった例外をスローしました。それは異常です。

それ以外は予測できないようです。これまでに何かが正常範囲外であっても、プロセスがゼロ以外の終了コードを返すことさえできない場合、その終了コードを待っているプロセスも失敗する可能性があります。 0以外の終了コードを確認することは、予期せぬ事故のために失敗する可能性を説明するために合理的に行うことができます。

#3でも可能かどうかは分かりませんが、未知数について説明しようとしている場合は、おそらく最も可能性があります。

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var exitCode = 0; 
     try 
     { 
      //do something 
     } 
     catch (SystemException systemEx) 
     { 
      //log 
      exitCode = -systemEx.HResult; 
     } 
     catch (Exception ex) 
     { 
      //log 
      Environment.ExitCode = int.MinValue; 

     } 
     Environment.ExitCode = exitCode; 
    } 
} 

あなた何ができるかです:ここで

は一例です。しかし、私はエラーを記述するために終了コードを使用しません。私はそのためにロギングを使用します。呼び出すアプリケーションに何をすべきかを伝えるために終了コードを使用します。おそらくゼロまたは非ゼロで十分です。私は、障害がIO関連であるかSQL関連であるかを示すより複雑なリターンコードを書きましたが、結局私はそれを使用しませんでした。失敗した場合は、ログにエラーメッセージが表示されます。