Golang でエラーを処理するにはどうすればよいですか?

Golang Deerawo Chu Lisurunihadousurebayoidesuka



Go は、その有効性、速度、効率性により人気が高まっているプログラミング言語です。ただし、他のプログラミング言語と同様に、開発段階や実行段階で間違いが発生する可能性があります。エラーを効果的に処理することは、Go プログラムの信頼性と安定性を確保するために不可欠です。

この記事では、Go でエラーを管理するためのいくつかの方法と推奨手順を検討します。







Golang でのエラーの処理

Go では次のことができます エラーを処理する 以下の方法で:



1: New() 関数

Go 言語が提供するのは、 新しい() エラーを管理する機能。組み込みエラー パッケージで利用できるこの機能を使用すると、開発者はプログラム用のカスタム エラー メッセージを作成できます。を活用することで、 新しい() この機能を利用すると、開発者はエラーを効果的に処理し、意味のあるエラー メッセージをユーザーに提供できます。



パッケージメイン

輸入 「エラー」
輸入 「fmt」

機能チェック ( 名前文字列 ) エラー {
nError := エラー.新規 ( '無効な名前' )
もしも 名前 = 「リナックス」 {
戻る nエラー
}
戻る なし
}
ファンクメイン ( ) {
名前:= 「リナックス」
エラー:= チェックしてください ( 名前 )
もしも エラー = なし {
fmt.Println ( エラー )
} それ以外 {
fmt.Println ( 「有効な名前」 )
}
}





上記のコードでは、 新しい() チェック名 文字列かどうかを確認する関数 Linux 指定された名前と一致します。この関数は次のメッセージを含むエラーを生成します 無効な名前 名前がそうでない場合 Linux 。名前が次と等しい場合、関数は nil を返し、エラーがなかったことを示します。 Linux

name 変数は次のように設定されます。 Linux main関数の呼び出しで チェック名 この関数は、name 変数も引数として受け取ります。 main 関数は、次の場合にエラー メッセージを出力します。 チェック名 関数がエラーを返します。 main 関数は、 有効な名前 もし チェック名 関数は nil を返します。



出力

2: Errorf() 関数

エラーf() Go の関数を使用すると、エラーも処理できます。 エラーf() エラーメッセージの書式を設定するオプションが表示されます。 fmt パッケージをインポートすると、開発者はそれを利用して、ニーズに合わせてエラー メッセージをカスタマイズできます。 エラーf() Go でのエラーの管理と伝達を合理化し、効率を向上させます。

パッケージメイン
輸入 「fmt」

関数ディビジョン ( n1、n2 あなた ) エラー {

もしも n2 == 0 {
戻る fmt.エラーf ( '%d / %d \n 数値をゼロで割ることはできません」 、n1、n2 )
}
戻る なし
}
ファンクメイン ( ) {
エラー:= div ( 42 0 )
もしも エラー = なし {
fmt.Printf ( 「エラー: %s」 、えー )
} それ以外 {
fmt.Println ( 「有効な分割」 )
}
}

上記のコードでは、 ディビジョン 関数は 2 つの整数入力 n1 と n2 を受け入れます。n2 がゼロの場合、エラーが生成されます。 n2 がゼロの場合、関数は n1 と n2 の値を含むメッセージを含むエラーを生成します。 n2 がゼロでない場合、関数は nil を返し、エラーがなかったことを示します。

main 関数が値 42 と 0 で div を実行すると、div が返すエラーは err 変数に保存されます。div 関数がエラーを返した場合、main 関数は fmt.Printf を使用してエラー メッセージを表示します。 main関数は印刷します 有効な部門 div 関数が nil を返した場合。

出力

3: 明示的なエラー処理

Go は、例外に依存することが多い他のプログラミング言語と比較して、明示的なエラー管理を奨励します。このアプローチにより、開発者は try-catch ブロックに依存するのではなく、if ステートメントを使用してエラーを明示的にチェックすることが推奨されます。こうすることで、エラーが発見され、適切に修正される可能性が高くなります。これを容易にするために、Go は以下を提供します。 エラーの場合 != nil このステートメントを使用すると、開発者は関数の実行後にエラーをチェックし、結果に基づいて適切なアクションを実行できます。 Go は、明示的なエラー処理により、より構造化された信頼性の高いエラー管理アプローチを提供します。

パッケージメイン
輸入 「fmt」

関数除算 ( a、b float64 ) ( float64、エラー ) {
もしも b == 0 {
戻る 0 、fmt.Errorf ( 「ゼロで割ることはできません」 )
}
戻る ある / b、なし
}
ファンクメイン ( ) {
結果、エラー:= 除算 ( 13 3 )
もしも エラー = なし {
fmt.Printf ( 「エラー: %v \n 、えー )
} それ以外 {
fmt.Printf ( 「結果: %f \n 、 結果 )
}
結果、エラー = 除算 ( 23 0 )
もしも エラー = なし {
fmt.Printf ( 「エラー: %v \n 、えー )
} それ以外 {
fmt.Printf ( 「結果: %f \n 、 結果 )
}
}

この図では、除算関数を使用して 2 つの値を除算します。出力はその結果です。 2 番目の数値が 0 の場合、関数は個別のエラー メッセージを含むエラーを生成します。

Divide は main 関数で 2 回呼び出されます。1 回目は有効な入力で、もう 1 回は無効な入力で呼び出されます。もし エラー!= nil ステートメントは、除算関数が使用されるたびにエラーが発生したかどうかを判断するために使用されます。エラーメッセージが発生した場合は、エラーメッセージが出力されます。そうでない場合は、結果が出力されます。

出力

4: 延期、パニック、回復

Golang はまた、 延期する ステートメント。プログラムまたはコードの特定のブロックの完了後に関数を実行するために使用されます。の 延期する ステートメントは、多くの場合、 回復 ランタイムパニックエラーを捕捉して回復する機能。実行時パニックエラーが発生すると、 回復 関数は、エラー状態から回復し、プログラムのクラッシュを防ぐために使用されます。これは、ファイルを閉じる、ネットワーク接続を閉じる、リソースを解放するなどのクリーンアップ タスクに役立ちます。これらのタスクを延期することで、エラーが発生した場合でも確実に実行されるようになります。

パニック 予期しないエラーが発生したときにプログラムの通常の実行を停止するために使用されます。 回復 パニックを処理し、プログラムの実行を継続するために使用されます。

パッケージメイン

輸入 「fmt」

パニックから回復する機能 ( ) {
もしも r := 回復する ( ) ; r = なし {
fmt.Println ( 「パニックから立ち直った」 、r )
}
}
関数除算 ( x,y float64 ) float64 {
パニックからの回復を延期する ( )

もしも そして== 0 {
パニック ( 「ゼロで割ることはできません」 )
}
戻る バツ /
}
ファンクメイン ( ) {
fmt.Println ( 分ける ( 13 3 ) )
fmt.Println ( 分ける ( 23 0 ) )
}

上記のコードでは、divide 関数を使用して 2 つの浮動小数点値を除算します。出力はその結果です。 2 番目の数値がゼロの場合、カスタマイズされたエラー メッセージが関数によって出力されます。 defer ステートメントは、 パニックから回復する 関数。の パニックから回復する この関数は、除算関数内で発生したパニックを検出し、発生した場合はエラーを出力します。

Divide は main 関数で 2 回呼び出されます。1 回目は有効な入力で、もう 1 回は無効な入力で呼び出されます。の fmt.Println 関数は、除算関数が実行されるたびに関数の出力を出力します。の パニックから回復する 関数は、パニックが発生した場合はそれを検出し、発生した場合はエラーを出力します。

出力

エラーを検出した後、プログラムはパニックから回復し、実行を続けました。ただし、コードがパニックになり、2 回目の除算呼び出しで値を返さなかったため、ゼロが返されました。

5: エラーラッピング

Go には、次のような機能も含まれています。 エラーラッピング を使用すると、エラー メッセージに追加のコンテキストを追加できます。これは、問題を記録したり、エラー メッセージに詳細を提供したりするのに役立ちます。これは、元のエラーと追加のコンテキストを埋め込むエラー タイプを作成することで実現できます。

パッケージメイン

輸入 「エラー」
輸入 「fmt」

ファンクメイン ( ) {
もしも エラー:= バー ( ) ;エラー = なし {
fmt.Println ( エラー )
}
}
関数除算 ( a、b float64 ) ( float64、エラー ) {
もしも b == 0 {
戻る 0 、エラー。新規 ( 「ゼロ除算」 )
}
戻る ある / b、なし
}
ファンクバー ( ) ( エラーエラー ) {
_、エラー = 除算 ( 42 0 )
もしも エラー = なし {
戻る fmt.エラーf ( 「計算に失敗しました: %w」 、えー )
}
戻る なし
}

上記のコードでは、この例では除算関数が 2 つの数値の比率を計算し、2 番目の値がゼロの場合はエラーをスローします。 bar 関数は、divide 関数を呼び出してから、次のエラーをラップします。 分ける fmt.Errorf 関数を使用して、元のエラー メッセージを含むメッセージを含む新しいエラーを返します。 bar 関数は main 関数によって呼び出され、返されるエラーも出力されます。

出力

結論

ソフトウェア開発には以下を含める必要があります エラー処理 Golang には、これを適切に実行するためのさまざまな組み込み関数とメソッドがあります。これらのメカニズムにより、開発者はエラーを捕捉して回復し、プログラムのクラッシュを防止し、エンド ユーザーに有益なエラー メッセージを提供することができます。これらのエラー処理メカニズムを効果的に使用することで、開発者は堅牢で信頼性が高く、効率的なソフトウェア アプリケーションを構築できます。