web-dev-qa-db-ja.com

os.Exit()およびpanic()を使用する場合

誰かがos.Exit()panic()の主な違いと、Goでの実際の使用方法を説明できますか?

82

まず、「実際にどのように使用されるか」という質問がある場合、開始する良い方法は 検索 Goソースコード(または、十分に大きいGoコードベース)です。 パッケージドキュメント 回答。

現在、os.Exitpanicはまったく異なります。 panic は、プログラムまたはその一部が回復不能な状態になったときに使用されます。

panicが呼び出されると、境界外のスライスのインデックス付けや型アサーションの失敗などの実行時エラーを暗黙的に含み、現在の関数の実行を直ちに停止し、途中で遅延関数を実行してゴルーチンのスタックを巻き戻します。その巻き戻しがゴルーチンのスタックの最上部に達すると、プログラムは終了します。

os.Exitは、プログラムを中止する必要がある場合すぐに、回復または遅延クリーンアップステートメントを実行する可能性がない場合に使用されます。エラーコードを返します(他のプログラムが何が起きたかを報告するために使用できます)。これはテストで役立ちます。この1つのテストが失敗すると、もう1つのテストも失敗することが既にわかっているため、今すぐ終了することもできます。これは、プログラムが必要なことをすべて完了し、終了する必要があるとき、つまりヘルプメッセージを出力した後にも使用できます。

ほとんどの場合、panicを使用せず(代わりにerrorを返す必要があります)、テストやプログラムの迅速な終了のために、os.Exitはほとんど必要ありません。

70
Ainar-G

まず第一に、os.Exit()はエラーなしでプログラムを正常に終了するために使用でき、パニックにならないため、1つの重要な違いです。もう1つは、recoverを使用して、どこかでパニックをキャッチして無視またはログに記録できることです。

しかし、誤った終了コードについて話している場合は、次のように言ってみましょう。

何かが恐ろしくうまくいかないときはおそらくpanicを使用してください。おそらく本番に進む前にキャッチすべきプログラマーのエラーです。これがスタックを印刷する理由です。

必要に応じて、os.Exit(errorCode)またはそのようなものを使用します。

  1. スクリプト作成のためにプログラムの終了コードを制御します。

  2. 予想されるエラー(ユーザー入力エラーなど)で正常に終了したい。

基本的にパニックはあなたのためであり、悪い終了コードはあなたのためです。

71
Not_a_Golfer

主な違いは次のとおりです。

  1. os.Exitは、遅延関数の実行をスキップします。
  2. os.Exitを使用すると、終了コードを指定できます。
  3. panicは終了していますが、os.Exitは終了していません。 (他の答えはこれに言及していないようです。)

遅延関数を実行する必要がある場合、panic以外の選択肢はありません。 (一方、遅延関数の実行をスキップする場合は、os.Exitを使用します。)

非void関数が次のように定義されている場合:

  1. 関数には多くのブランチが含まれています
  2. すべてのブランチはreturnまたはpanicで終了します

その場合、panicos.Exitに置き換えることはできません。そうしないと、コンパイラーはプログラムのコンパイルを拒否し、「関数の終わりに戻りがありません」と言います。 (Goはここでは非常に馬鹿です。log.Panicでさえ関数を終了しません。)

その他の条件の場合:

  1. 本当に配線されたものが発生した場合、panicを使用します。プログラミング論理エラー。
  2. 指定された終了コードで即時に終了する場合は、os.Exitを使用します。
2
weakish