Skip to content

Commit 42ae4cb

Browse files
committed
error-handling - apply review comments
Apply review comment
1 parent b273c3d commit 42ae4cb

File tree

1 file changed

+29
-29
lines changed

1 file changed

+29
-29
lines changed

1.6/ja/book/error-handling.md

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Rustでは戻り値を使います。
7575
* [複数のエラー型を扱う](#複数のエラー型を扱う)
7676
* [`Option``Result` を合成する](#option-と-result-を合成する)
7777
* [コンビネータの限界](#コンビネータの限界)
78-
* [早期のリターン](#早期のリターン)
78+
* [早期リターン](#早期リターン)
7979
* [`try!` マクロ](#try-マクロ)
8080
* [独自のエラー型を定義する](#独自のエラー型を定義する)
8181
* [標準ライブラリのトレイトによるエラー処理](#standard-library-traits-used-for-error-handling)
@@ -182,7 +182,7 @@ fn main() {
182182
<!-- conditions, yet, the program does not include an explicit call to `panic` like -->
183183
<!-- the first example. This is because the -->
184184
<!-- panic is embedded in the calls to `unwrap`. -->
185-
先ほどの例で、プログラムが2つのエラー条件のいずれかを満たした時に、パニックすると言いました。
185+
先ほどの例で、プログラムが2つのエラー条件のいずれかを満たしたときに、パニックすると言いました。
186186
でもこのプログラムは、最初の例とは違って明示的に `panic` を呼び出してはいません。
187187
実はパニックは `unwrap` の呼び出しの中に埋め込まれているのです。
188188

@@ -191,7 +191,7 @@ fn main() {
191191
<!-- It would be better if we just showed the code for unwrapping because it is so -->
192192
<!-- simple, but to do that, we will first need to explore the `Option` and `Result` -->
193193
<!-- types. Both of these types have a method called `unwrap` defined on them. -->
194-
Rustでなにかを「アンラップする」、こう言っているのと同じです。
194+
Rustでなにかを「アンラップする」とき、こう言っているのと同じです。
195195
「計算結果を取り出しなさい。もしエラーになっていたのなら、パニックを起こしてプログラムを終了させなさい。」
196196
アンラップのコードはとてもシンプルなので、多分、それを見せたほうが早いでしょう。
197197
でもそのためには、まず `Option``Result` 型について調べる必要があります。
@@ -244,7 +244,7 @@ fn find(haystack: &str, needle: char) -> Option<usize> {
244244
<!-- with the type `fn<T>(value: T) -> Option<T>`. Correspondingly, `None` is also a -->
245245
<!-- value constructor, except it has no arguments. You can think of `None` as a -->
246246
<!-- function with the type `fn<T>() -> Option<T>`. -->
247-
この関数がマッチする文字を見つけた時、単に `offset` を返すだけではないことに注目してください。
247+
この関数がマッチする文字を見つけたとき、単に `offset` を返すだけではないことに注目してください。
248248
その代わりに `Some(offset)` を返します。
249249
`Some``Option` 型の *値コンストラクタ* の一つです。
250250
これは `fn<T>(value: T) -> Option<T>` という型の関数だと考えることもできます。
@@ -282,7 +282,7 @@ fn main() {
282282
<!-- `None` instead of `Some(t)`. -->
283283
このコードは `find` 関数が返した `Option<usize>`*場合分け* に、 [パターンマッチ][1] を使っています。
284284
実のところ、場合分けが、`Option<T>` に格納された値を取り出すための唯一の方法なのです。
285-
これは、`Option<T>``Some(t)` ではなく `None` だった時、プログラマであるあなたが、このケースに対処しなければならないことを意味します。
285+
これは、`Option<T>``Some(t)` ではなく `None` だったとき、プログラマであるあなたが、このケースに対処しなければならないことを意味します。
286286

287287
<!-- But wait, what about `unwrap`,which we used [`previously`](#code-unwrap-double)? -->
288288
<!-- There was no case analysis there! Instead, the case analysis was put inside the -->
@@ -421,8 +421,8 @@ fn extension(file_name: &str) -> Option<&str> {
421421
<!-- the extension of a file is `rs` even if none is present. As you might imagine, -->
422422
<!-- the case analysis for this is not specific to file extensions - it can work -->
423423
<!-- with any `Option<T>`: -->
424-
もう一つの共通のパターンは、`Option` の値が `None` だった時のデフォルト値を与えることです
425-
例えばファイルの拡張子がない時は、それを `rs` とみなすようなプログラムを書きたくなるかもしれません。
424+
もう一つの共通のパターンは、`Option` の値が `None` だったときのデフォルト値を与えることです
425+
例えばファイルの拡張子がないときは、それを `rs` とみなすようなプログラムを書きたくなるかもしれません。
426426
ご想像の通り、このような場合分けはファイルの拡張子に特有のものではありません。
427427
どんな `Option<T>` でも使えるでしょう:
428428

@@ -554,7 +554,7 @@ fn file_path_ext(file_path: &str) -> Option<&str> {
554554
<!-- remove choices because they will panic if `Option<T>` is `None`. -->
555555
コンビネータは明示的な場合分けを減らしてくれるので、 `Option` のような型をエルゴノミックにします。
556556
またこれらは *不在の可能性* を、呼び出し元がそれに合った方法で扱えるようにするので、合成可能だといえます。
557-
`unwrap` のようなメソッドは、 `Option<T>``None` の時にパニックを起こすので、このような選択の機会を与えません。
557+
`unwrap` のようなメソッドは、 `Option<T>``None` のときにパニックを起こすので、このような選択の機会を与えません。
558558

559559
<!-- ## The `Result` type -->
560560
## `Result`
@@ -707,7 +707,7 @@ impl str {
707707
それも悪いやり方ではありませんが、実装の内側では *なぜ* 文字列が整数としてパースできなかったを、ちゃんと区別しています。
708708
(空の文字列だったのか、有効な数字でなかったのか、大きすぎたり、小さすぎたりしたのか。)
709709
従って、`Result` を使ってより多くの情報を提供するほうが、単に「不在」を示すことよりも理にかなっています。
710-
今後、もし `Option``Result` のどちらを選ぶという事態に遭遇した時は、このような理由付けのやり方を真似てみてください。
710+
今後、もし `Option``Result` のどちらを選ぶという事態に遭遇したときは、このような理由付けのやり方を真似てみてください。
711711
もし詳細なエラー情報を提供できるのなら、多分、それをしたほうがいいでしょう。
712712
(後ほど別の例もお見せます。)
713713

@@ -855,16 +855,16 @@ fn double_number(number_str: &str) -> Result<i32> {
855855
<!-- appealing. -->
856856
* **即興で書いたサンプルコード。**
857857
サンプルコードや簡単なプログラムを書いていて、エラーハンドリングが単に重要でないこともあります。
858-
このような時に `unwrap` の便利さは、とても魅力的に映るでしょう。
858+
このようなときに `unwrap` の便利さは、とても魅力的に映るでしょう。
859859
これに打ち勝つのは難しいことです。
860860

861861
<!-- * **When panicking indicates a bug in the program.** When the invariants of -->
862862
<!-- your code should prevent a certain case from happening (like, say, popping -->
863863
<!-- from an empty stack), then panicking can be permissible. This is because it -->
864864
<!-- exposes a bug in your program. This can be explicit, like from an `assert!` -->
865865
<!-- failing, or it could be because your index into an array was out of bounds. -->
866-
* **パニックがプログラムのバグの兆候となる時**
867-
コードの中の不変条件が、ある特定のケースの発生を未然に防ぐ時(例えば、空のスタックから取り出そうとしたなど)、パニックを起こしても差し支えありません。
866+
* **パニックがプログラムのバグの兆候となるとき**
867+
コードの中の不変条件が、ある特定のケースの発生を未然に防ぐとき(例えば、空のスタックから取り出そうとしたなど)、パニックを起こしても差し支えありません。
868868
なぜなら、そうすることでプログラムに潜むバグが明るみに出るからです。
869869
これは `assert!` の失敗のような明示的な要因によるものだったり、配列のインデックスが境界から外れたからだったりします。
870870

@@ -876,7 +876,7 @@ fn double_number(number_str: &str) -> Result<i32> {
876876
<!-- a bit nicer to deal with, since it will show your message instead of -->
877877
<!-- “callaed unwrap on a `None` value.” -->
878878
これは多分、完全なリストではないでしょう。
879-
さらに `Option` を使う時は、ほとんどの場合で [`expect`](../std/option/enum.Option.html#method.expect) メソッドを使う方がいいでしょう。
879+
さらに `Option` を使うときは、ほとんどの場合で [`expect`](../std/option/enum.Option.html#method.expect) メソッドを使う方がいいでしょう。
880880
`expect``unwrap` とほぼ同じことをしますが、 `expect` では与えられたメッセージを表示するところが異なります。
881881
この方が結果として起こったパニックを、少し扱いやすいものにします。
882882
なぜなら「 `None` な値に対してアンラップが呼ばれました」というメッセージの代わりに、指定したメッセージが表示されるからです。
@@ -927,7 +927,7 @@ fn double_number(number_str: &str) -> Result<i32> {
927927
<!-- or can we continue using combinators? -->
928928
もちろん現実のコードは、いつもこんなにクリーンではありません。
929929
時には `Option` 型と `Result` 型が混在していることもあるでしょう。
930-
そんな時は、明示的な場合分けに頼るしかないのでしょうか?
930+
そんなときは、明示的な場合分けに頼るしかないのでしょうか?
931931
それとも、コンビネータを使い続けることができるのでしょうか?
932932

933933
<!-- For now, let's revisit one of the first examples in this chapter: -->
@@ -958,7 +958,7 @@ fn main() {
958958
<!-- could just use a `String` to describe the error. Let's try: -->
959959
ここでの問題は `argv.nth(1)``Option` を返すのに、 `arg.parse()``Result` を返すことです。
960960
これらを直接合成することはできません。
961-
`Option``Result` の両方に出会った時の *通常の* 解決策は `Option``Result` に変換することです。
961+
`Option``Result` の両方に出会ったときの *通常の* 解決策は `Option``Result` に変換することです。
962962
この例で(`env::args()` が)コマンドライン引数を返さなかったということは、ユーザーがプログラムを正しく起動しなかったことを意味します。
963963
エラーの理由を示すために、単純に `String` を使うこともできます。
964964
試してみましょう:
@@ -995,7 +995,7 @@ fn main() {
995995
この例では、いくつか新しいことがあります。
996996
ひとつ目は [`Option::ok_or`](../std/option/enum.Option.html#method.ok_or) コンビネータを使ったことです。
997997
これは `Option``Result` へ変換する方法の一つです。
998-
変換には `Option``None` の時に使われるエラーを指定する必要があります
998+
変換には `Option``None` のときに使われるエラーを指定する必要があります
999999
他のコンビネータと同様に、その定義はとてもシンプルです:
10001000

10011001
```rust
@@ -1084,7 +1084,7 @@ fn main() {
10841084
<!-- 2. A problem reading data from the file. -->
10851085
<!-- 3. A problem parsing the data as a number. -->
10861086
1. ファイルを開くときの問題
1087-
2. ファイルからデータを読み込む時の問題
1087+
2. ファイルからデータを読み込むときの問題
10881088
3. データを数値としてパースするときの問題
10891089

10901090
<!-- The first two problems are described via the -->
@@ -1117,7 +1117,7 @@ fn main() {
11171117
<!-- type from `i32` to something else. -->
11181118
まず最初に `file_double` 関数をリファクタリングしましょう。
11191119
この関数を、このプログラムの他の構成要素と合成可能にするためには、上記の問題のいずれかに遭遇しても、パニック *しない* ようにしなければなりません。
1120-
これは実質的には、なにかの操作に失敗した時に、この関数が *エラーを返すべき* であることを意味します。
1120+
これは実質的には、なにかの操作に失敗したときに、この関数が *エラーを返すべき* であることを意味します。
11211121
ここでの問題は、`file_double` のリターン型が `i32` であるため、エラーの報告には全く役立たないことです。
11221122
従ってリターン型を `i32` から別の何かに変えることから始めましょう。
11231123

@@ -1133,7 +1133,7 @@ fn main() {
11331133
`Option` なら間違いなく簡単に使えます。
11341134
もし3つのエラーのどれかが起こったら、単に `None` を返せばいいのですから。
11351135
これはたしかに動きますし、 *パニックを起こすよりは良くなっています*
1136-
とはいえ、もっと良くすることもだってできます
1136+
とはいえ、もっと良くすることもできます
11371137
`Option` の代わりに、発生したエラーについての詳細を渡すべきでしょう。
11381138
ここでは *エラーの可能性* を示したいのですから、`Result<i32, E>` を使うのがよさそうです。
11391139
でも `E` を何にしたらいいのでしょうか?
@@ -1195,7 +1195,7 @@ fn main() {
11951195
<!-- example, the very last call to `map` multiplies the `Ok(...)` value (which is -->
11961196
<!-- an `i32`) by `2`. If an error had occurred before that point, this operation -->
11971197
<!-- would have been skipped because of how `map` is defined. -->
1198-
`map``Result` の値が `Ok(...)` の時に関数を適用するために使います
1198+
`map``Result` の値が `Ok(...)` のときに関数を適用するために使います
11991199
例えば、一番最後の `map` の呼び出しは、`Ok(...)` の値( `i32` 型)に `2` を掛けます。
12001200
もし、これより前にエラーが起きたなら、この操作は `map` の定義に従ってスキップされます。
12011201

@@ -1205,7 +1205,7 @@ fn main() {
12051205
<!-- both `io::Error` and `num::ParseIntError` implement `ToString`, we can call the -->
12061206
<!-- `to_string()` method to convert them. -->
12071207
`map_err` は全体をうまく動かすための仕掛けです。
1208-
`map_err``map` に似ていますが、 `Result` の値が `Err(...)` の時に関数を適用するところが異なります
1208+
`map_err``map` に似ていますが、 `Result` の値が `Err(...)` のときに関数を適用するところが異なります
12091209
今回の場合は、全てのエラーを `String` という同一の型に変換する予定でした。
12101210
`io::Error``num::ParseIntError` の両方が `ToString` を実装していたので、 `to_string()` メソッドを呼ぶことで変換できました。
12111211

@@ -1214,18 +1214,18 @@ fn main() {
12141214
<!-- returns. -->
12151215
説明し終わった後でも、このコードは難解なままです。
12161216
コンビネータの使い方をマスターすることは重要ですが、コンビネータには限界もあるのです。
1217-
次は、早期のリターンと呼ばれる、別のアプローチを試してみましょう。
1217+
次は、早期リターンと呼ばれる、別のアプローチを試してみましょう。
12181218

12191219
<!-- ## Early returns -->
1220-
## 早期のリターン
1220+
## 早期リターン
12211221

12221222
<!-- I'd like to take the code from the previous section and rewrite it using *early -->
12231223
<!-- returns*. Early returns let you exit the function early. We can't return early -->
12241224
<!-- in `file_double` from inside another closure, so we'll need to revert back to -->
12251225
<!-- explicit case analysis. -->
1226-
前の節で使ったコードを、 *早期のリターン* を使って書き直してみようと思います。
1227-
早期のリターンとは、関数の途中で抜けることを指します。
1228-
`file_double` のクロージャの中にいる間は、早期のリターンはできないので、明示的な場合分けまでいったん戻る必要があります。
1226+
前の節で使ったコードを、 *早期リターン* を使って書き直してみようと思います。
1227+
早期リターンとは、関数の途中で抜けることを指します。
1228+
`file_double` のクロージャの中にいる間は、早期リターンはできないので、明示的な場合分けまでいったん戻る必要があります。
12291229

12301230
```rust
12311231
use std::fs::File;
@@ -1403,7 +1403,7 @@ fn main() {
14031403
<!-- with *structured data*. We endeavor to not drop information from underlying -->
14041404
<!-- errors in case the caller wants to inspect the details. -->
14051405
ファイルから整数値を取り出す例で `String` をエラー型として用いた代わりに、独自のエラー型を定義し、 *構造化されたデータ* によってエラー内容を表すことができます。
1406-
呼び出し元が詳細を検査したい時に備え、大元のエラーについての情報を取りこぼさないよう、努力してみましょう。
1406+
呼び出し元が詳細を検査したいときに備え、大元のエラーについての情報を取りこぼさないよう、努力してみましょう。
14071407

14081408
<!-- The ideal way to represent *one of many possibilities* is to define our own -->
14091409
<!-- sum type using `enum`. In our case, an error is either an `io::Error` or a -->
@@ -1471,8 +1471,8 @@ fn main() {
14711471
<!-- will do in a pinch, particularly if you're writing an application. If you're -->
14721472
<!-- writing a library, defining your own error type should be strongly preferred so -->
14731473
<!-- that you don't remove choices from the caller unnecessarily. -->
1474-
目安となる方法は独自のエラー型を定義することですが、 `String` エラー型も、いざという時に役立ちます
1475-
特にアプリケーションを書いている時などはそうです
1474+
目安となる方法は独自のエラー型を定義することですが、 `String` エラー型も、いざというときに役立ちます
1475+
特にアプリケーションを書いているときなどはそうです
14761476
もしライブラリを書いているのなら、呼び出し元の選択肢を理由もなく奪わないために、独自のエラー型を定義することを強く推奨します。
14771477

14781478
# Standard library traits used for error handling

0 commit comments

Comments
 (0)