さまざまな種類のエラー処理とリソース管理を実装してください。
プログラミングで重要なのは、エラーが起きたときでも、エラーを適切に処理してリソースを閉じる方法です。
この演習では、さまざまなエラーを処理する必要があります。エラー処理はプログラミング言語によって大きく異なるため、何が必要なのかを正確に知るには、自分のトラックのテストを参照する必要があります。
小さなWebサーバーを作り、さらに小さなユーザーデータベースに問い合わせます。簡単そうに思えますが、現実の世界では、多くのことがうまくいかないものです(しかもよくあります)。
"https://"で始まらなければなりません"example.com"である必要があります"https://example.com/"、"https://example.com/users/"、"https://example.com/users/<user_id>"だけですuser_idが正の整数でないことがありますuser_idのユーザーが存在しないことがあります何か問題が起きたときは、エンドユーザーが問題を解決できるように、わかりやすく役立つエラーメッセージを伝えることが大切です。そのためには、エラーを検出した場所からエラーメッセージを生成する場所まで、有益なエラーが伝わるようにコードを書く必要があります。
幸いなことに、RocではErrタグの中にペイロード(つまりデータ)を持たせることができます。エラーメッセージをそのまま持たせたくなりますが(たとえばErr("User #42 was not found"))、単純なケースではそれで問題ないこともあるものの、いくつかの制約があります。
Str.to_u64関数は、日数、秒数、ユーザーIDなど、さまざまな整数の変換に使えます。エラーメッセージがCould not convert string "0.5" to a positive integerだけだと、ユーザーは問題を解決するための情報を得られないかもしれません。そこでこの演習では、エラーに意味のあるタグと、それに対応する役立つペイロードを持たせます。たとえば、ユーザーが見つからなかった場合、エラーはErr(UserNotFound(42))のようになります。
では、始めましょう! やることは次のとおりです。
get_userを実装して、要求されたユーザーをusersの「データベース」から返します(実際はただのDictです)。ユーザーが見つからない場合は、Err(KeyNotFound)ではなくErr(UserNotFound(user_id))を返すようにしてください。parse_user_idを実装して、URLのパス(たとえば"/users/123")を正の整数のユーザーID(123)に変換します。エラーの場合はErr(InvalidUserId(user_id_str))を返します。getPageを実装します。
"https://example.com/"なら、Ok("Home page")を返します"https://example.com/users/"なら、Ok("Users page")を返します"https://example.com/users/<user_id>"なら、ユーザーIDを解析して、そのIDのユーザーを読み込み、Ok("<user name>'s page")を返します"https://"でなければ、Err(InsecureConnection(url))を返します"example.com"でなければ、Err(InvalidDomain(url))を返します/、/users/、/users/<user id>のいずれでもなければ、Err(PageNotFound(path))を返しますErr(InvalidUserId(user_id_str))を返しますErr(UserNotFound(user_id))を返しますerror_essageを実装して、これまでのエラーを翻訳済みのエラーメッセージに変換します。少なくとも英語を扱える必要がありますが、別の言語にも挑戦してみるとよいでしょう。英語のエラーメッセージは次のようになります。"Insecure connection (non HTTPS): http://example.com/users/789""Invalid domain name: https://google.com/wrong""Page not found: /oops""User ID is not a positive integer: abc""User #42 was not found"注: HTTPSではなくHTTPを使った場合にエラーメッセージを表示する代わりに、WebサーバーがブラウザをHTTPSへリダイレクトすれば、ユーザーはエラーに気づきもしません。Rocではエラーが機械に優しい形なので、これを実装するのはとても簡単です。