エラー処理
命令型言語では、エラーを報告するための2つの主要なメカニズムがあることをご存知でしょう。例外をスローするか、明示的にコード/値を返す。 ここには2つのキャンプさえあると言うことができます-例外の支持者と明示的な帰還の支持者ですが、すべてがいくらか悪いです。 実際には2つのキャンプがありますが、それらは異なります。コード内のエラー処理の重要性を理解している人と、プログラミングのこの側面をほとんど無視している人です。 さらに、これまでのところ、第2陣営は議論の余地のないリーダーです。
これが「良い」プログラマーを「悪い」プログラマーと区別するものであると仮定するのは論理的であり、間違いなくこれにはいくつかの真実があります。 しかし、一つだけあります。 ツールキット-この場合、それは「プログラミング言語」です-解決します。 あなたの言語で「正しいこと」を行うよりも「間違った」ことをはるかに簡単に行える場合-「[LANG]の書き方」の記事や本の数が役に立たないことを確認してください-人々は間違ったことを続けます。 それは簡単だからです。
すべての小学生はすでに「グローバル変数」が悪であることを知っているようです。 このトピックに関する記事はいくつありますか? それにもかかわらず、今でも2015年には、グローバル変数を使用して大量のコードが見つかります。 なんで?
また、グローバル変数を作成するために、「do it wrong」はほとんどすべてのプログラミング言語で正確に1行かかります。 同時に、「正しいオプション」を作成するには、最小限のラッパーであるため、より多くの時間と労力を費やす必要があります。 さらに1文字があっても-それは決定します。
これは実現するために非常に重要です-ツールキットが決定します。 ツールキットは私たちの選択を形成します。
しかし、エラー処理に戻って、Goの作者が例外を「間違った方法」と見なし、Goでそれらを実装しないことにした理由と、Goの「複数の値を返す」と他の言語の類似する値の違いを理解しようとします。
たとえば、簡単なこと-ファイルを開く。
C ++コードは次のとおりです
ifstream file; file.open ("test.txt");
, «» failbit , ifstream.exeptions() try{} catch{} . «» — , « ».
Python:
file = open('test.txt', 'r')
— open(), . « » « try-catch, --».
( — , C++ Python — , , . «» .)
Go:
file, err := os.Open("test.txt")
— , «» . error , — Go:
./main.go:8: err declared and not used
, _, - , :
if err != nil { log.Fatal("Aborting: ", err) }
«» Go — . , « » — , strconv.Atoi() — — , — , . - .
. — . , .
- , — «» , — . , . «» — ~100% , «» — . — , , .
Go — : . — mycode_test.go , Test:
import "testing" func TestMycode(t *testing.T) { }
. — if-. , .
,
go test
. -cover, .
game-changer. , « », , « » . , . Go .
, , , , , , , , — . , QA-. «», «» .
. , , — , — . Go — « ». TDD — .
— «» , «». Go KISS- « » ( ) . -, Go .
, , Go.
Why Go gets exceptions right
It's 2015. Why do we still write insecure software?