Golang のエラー処理 error
golang には try/catch のような例外処理機構はありません。ステータスがエラーかどうかを判断するには戻り値に頼るしかありません (もちろんパニック/リカバリ機構はありますが、一般的には)。予期しないエラーのみを処理します) )。
関数の戻り値の場合、最後のパラメーターは関数の操作のステータスを表すエラー オブジェクトを返すのが慣例です。
例:
- n, err := func()
- if err != nil {
- ...//process error
- }
またはそれらを一緒に書きます
- if n, err : = func(); err != nil {
- ...//エラー処理
- }
error オブジェクトは、errors.New() または fmt.Errorf() によって構築できます。
例:
- var DivisionErr =errors.New("0 で割ることはできません")
または
- err := fmt.Errorf("%d 0 で割ることはできません", arg)
まずはどのような種類のエラーなのか見てみましょう。
error は、標準ライブラリのインターフェイス タイプとして定義されており、Error() メソッドが 1 つだけあります:
- type errorinterface {
- Error() string
- }
つまり、カスタム構造のみです。 Error() メソッドが必要です。これは、エラー インターフェイスの実装と同等です。
構造体を作成し、Error() メソッドを実装して、希望に応じてエラー オブジェクトを構築できます。
例:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>type division struct {</li><li> arg int</li><li> str string</li><li>}</li><li></li><li>func (e *division) Error() string {</li><li> return fmt.Sprintf("%d %s", e.arg, e.str)</li><li>}</li><li></li><li>func divideCheck(arg1, arg2 int) (error) {</li><li> if arg2 == 0 {</li><li> return &division{arg1, "can't divided by 0"}</li><li> }</li><li> return nil</li><li>}</li></ol>
別の例を見てみましょう。データの集合に分割できない状況 (つまり、除数が 0) があるかどうかを確認します。分割できない場合は、エラーが返されます。
コードは次のとおりです:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>package main</li><li></li><li>import "fmt"</li><li></li><li>func divideCheck(arg1, arg2 int) (error) {</li><li> if arg2 == 0 {</li><li> return fmt.Errorf("%d can't divided by 0", arg1)</li><li> }</li><li> return nil</li><li>}</li><li></li><li>func main() {</li><li> var err error</li><li></li><li> err = divideCheck(4, 2)</li><li> if err != nil {</li><li> fmt.Println(err)</li><li> return</li><li> }</li><li></li><li> err = divideCheck(8, 0)</li><li> if err != nil {</li><li> fmt.Println(err)</li><li> return</li><li> }</li><li>}</li></ol>
この関数を実装しましたが、このコードは非常に洗練されておらず、関数呼び出しが実行されるたびに、少なくとも 3 行がエラー処理に使用されます。
最適化しましょう。実装する必要がある関数は、割り切れない数値がある限りエラーを返すというものです。その後、各チェック後の状態を内部状態変数に保存し、すべての処理が完了した後にこの変数をチェックするだけで済みます。
コードは次のとおりです:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>package main</li><li></li><li>import "fmt"</li><li></li><li>type division struct {</li><li> err error</li><li>}</li><li></li><li>func (this *division)DivideCheck(arg1, arg2 int) {</li><li> if this.err != nil {</li><li> return</li><li> }</li><li> if arg2 == 0 {</li><li> this.err = fmt.Errorf("%d can't divided by 0", arg1)</li><li> return</li><li> }</li><li>}</li><li></li><li>func (this *division)Err() error {</li><li> return this.err</li><li>}</li><li></li><li>func main() {</li><li> d := new(division)</li><li> d.DivideCheck(4, 2)</li><li> d.DivideCheck(8, 0)</li><li> if d.Err() != nil {</li><li> fmt.Println(d.Err())</li><li> }</li><li>}</li></ol>
はこれを行うことでコードをよりエレガントにし、各チェックの前に内部状態が間違っているかどうかを判断し、エラーが発生した場合はパフォーマンスをほとんど損なうことなくすぐに戻ります。
Golang のエラー処理はよく批判されますが、Go でプログラミングする方法を知っていれば、それでも非常にエレガントに実行できます~
http://www.bkjia.com/PHPjc/1114325.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/1114325.html技術記事 Golang のエラー処理エラー Golang には try/catch などの例外処理メカニズムがなく、戻り値に頼ってステータスがエラーかどうかを判断することしかできません (もちろんパニック/回復メカニズムはありますが、一般的には .. .