さまざまな種類のエラー処理とリソース管理を実装してください。
プログラミングで重要なのは、エラーが起きたときでも、エラーを適切に処理してリソースを閉じる方法です。
この演習では、さまざまなエラーを処理する必要があります。エラー処理はプログラミング言語によって大きく異なるため、何が必要なのかを正確に知るには、自分のトラックのテストを参照する必要があります。
Goのエラーやパニックに慣れていない場合は、まずこれらのトピックに関するドキュメントを読んで背景を理解することをお勧めします。
この演習では、関数Use(opener ResourceOpener, input string) errorを定義する必要があります。この関数は、リソースを開き、結果のリソースに対してFrob(input)を呼び出し、その後(すべての場合において)そのリソースを閉じます。
関数はエラーとパニックを適切に処理する必要があります。
ResourceOpener openerは、リソースを「開く」ために直接opener()を呼び出すことができる関数です。
これは、Goの慣用的な方法でResourceとエラー値を返します:
Resource、ResourceOpener、FrobError、TransientErrorの定義については、common.goファイルを参照してください。
解答は、common.goとerror_handling_test.goと同じパッケージ「erratum」に定義します。
これにより、それらの型を解答で使用できるようになります。
Use関数内でエラーが発生する可能性がある箇所がいくつかあります:
最初の引数としてUseに渡されたResourceOpener関数を呼び出すと、TransientError型のエラーで失敗することがあります。その場合は、リソースを開く試行を続けてください。
それ以外の種類のエラーであれば、Use関数からそのエラーを返してください。
ResourceOpener関数から返されたResourceに対してFrob関数を呼び出すと、FrobError(または別の種類のエラー)でパニックする可能性があります。
本当にFrobErrorである場合は、リソースのDefrob関数を呼び出す必要があります。その際、パニックしたFrobErrorの.defrobTag変数をDefrob関数への入力として使います。
いずれの場合も、Useはエラーを返す必要があります。
また注意してください:Resourceが正常に開かれた場合は、何があっても(エラーが発生した場合でも)そのClose関数を正確に一度だけ呼び出すようにしてください。
特定のエラー型のテストは、型アサーションで行うことができます。 また、パニックからの回復時にエラー情報を返す便利な方法として、名前付き戻り値を参照する必要があるかもしれません。