Gox言語は、例外処理にGo言語と同様の遅延メカニズムと回復メカニズムを使用できます。次に例を示します。
defer fn() {
r = recover()
if r != nil {
println("recover:", r)
}
}()
f, err = os.Open("file.ql")
if err != nil {
fprintln(os.Stderr, err)
return 1
}
defer println("exit!")
defer f.Close()
println(10/0)
b = make([]byte, 8)
n, err = f.Read(b)
if err != nil {
fprintln(os.Stderr, "Read failed:", err)
return 2
}
println(string(b[:n]))
*注:バージョン0.988以降、不要なファイルサイズを減らすために、Goxは他のスクリプトエンジンを廃止し、Qlangエンジンのみをサポートしています。そのため、この記事の他のスクリプトエンジンの内容は無効になり、古いバージョンの参照用にのみ予約されています。
Gox言語のAnkoエンジンバージョンでは、Go言語の独自の例外処理メカニズムと比較して、より一般的なtry-catch-finallyの組み合わせが導入されています。
まず第一に、Gox言語にはdeferキーワードとrecover関数はありませんが、パニック関数があり、どのような種類の例外もスローできます。次に例を示します。
panic("this is a panic")
panic(123)
panic([1, "good morning", true])
panic({"a": 10, "b": "good morning", "c": true})
これらはすべて可能です。
Gox言語では、try-catch-finallyの組み合わせを使用して、Go言語関数で生成されたパニックを含むパニック例外をキャッチし、それに応じて処理できます。例えば:
try {
panic({"a": 10, "b": "good morning", "c": true})
} catch e {
printfln("error: %v", e)
} finally {
println("final")
}
try {
panic(123)
} catch e {
printfln("error: %v", e)
}
プログラム実行後の出力:
error: map[a:10 b:good morning c:true]
final
error: 123
これらの例外が正しくキャッチされたことを示します。
Gox言語での例外処理は、従来の言語に慣れている開発者にとってよりよく理解されていることがわかります。ただし、現在のところ据え置き方法はなく、代わりにGoプログラミングに精通している開発者は問題を抱えています。たとえば、延期は開いているファイルを閉じる、ネットワーク接続またはデータベース接続を閉じるほど便利ではありません。
実際、最終的には、機能を延期する役割をある程度置き換えることができます。さらに、Gox言語は、throwを使用して例外をスローすることもサポートしています。