# Question16 - 例外処理の基本 本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。 ## この問題のねらい - 実行時に発生する異常な状態(例外)を捕捉し、プログラムを異常終了させずに対処できること - 例外の種類ごとに異なる対処を行えること(複数の異なる種類の例外を区別して捕捉できること) - 例外が発生したかどうかに関わらず、必ず実行したい後始末の処理を用意できること - 独自の例外の種類を定義し、意図的に発生させたうえで、それを呼び出し元で捕捉できること 以下の設問はそれぞれ独立したプログラムとして実装してください。 --- ## 設問1 2つの整数(割られる数・割る数)を受け取り、割り算した結果を返す処理を実装してください。 次の処理を行う呼び出し元プログラムを作成してください。 1. `10` と `2` を渡してこの処理を呼び出し、戻り値を出力する 2. `10` と `0` を渡してこの処理を呼び出す 割る数に `0` を渡した場合、実行時にエラー(例外的な状況)が発生します。このエラーを捕捉し、プログラムを異常終了させる代わりに `0で割ることはできません` と出力してください。 ### 期待される結果 ``` 5 0で割ることはできません ``` --- ## 設問2 文字列を1つ受け取り、それを整数に変換したうえで2倍した値を返す処理を実装してください。 次の処理を行う呼び出し元プログラムを作成してください。 1. `"10"` を渡してこの処理を呼び出し、戻り値を出力する 2. `"abc"`(数値に変換できない文字列)を渡してこの処理を呼び出す 3. `""`(空文字列)を渡してこの処理を呼び出す ### 要件 - 数値に変換できない文字列を渡した場合、実行時にエラー(例外的な状況)が発生します。このエラーを捕捉し、`数値に変換できません` と出力してください。 - 空文字列を渡した場合は、変換を試みる前に、自分で意図的に別の種類のエラーを発生させてください。呼び出し元では、このエラーを上記の変換エラーとは区別して捕捉し、`入力が空です` と出力してください。 - 上記いずれにも該当しない場合は、変換した値を2倍にして出力してください。 ### 期待される結果 ``` 20 数値に変換できません 入力が空です ``` --- ## 設問3 整数の一覧(配列)と、取得したい位置を表すインデックス(0番目から数える)を受け取り、その位置の値を返す処理を実装してください。 次の要素を持つ整数の一覧を用意してください。 - `10, 20, 30` 次の処理を行う呼び出し元プログラムを作成してください。 1. 上記の一覧と、有効な位置(`1`)を渡してこの処理を呼び出し、戻り値を出力する 2. 上記の一覧と、範囲外の位置(`5`)を渡してこの処理を呼び出す ### 要件 - 範囲外の位置を指定した場合、実行時にエラー(例外的な状況)が発生します。このエラーを捕捉し、`指定した位置にデータがありません` と出力してください。 - エラーが発生した場合・しなかった場合のいずれでも、必ず最後に `処理を終了します` が1回出力されるようにしてください。ただし、この出力は、エラーを捕捉した後の処理として個別に書くのではなく、エラーの有無にかかわらず必ず実行される後始末の処理として実装すること(1・2の呼び出しそれぞれについて、この後始末の処理が実行されます)。 ### 期待される結果 ``` 20 処理を終了します 指定した位置にデータがありません 処理を終了します ``` --- ## 設問4 年齢(整数)を受け取り、値をそのまま返す処理を実装してください。ただし、受け取った値が0未満だった場合は、値をそのまま返す代わりに、独自に定義した種類のエラー(以下「不正な年齢エラー」とする)を発生させるようにしてください。「不正な年齢エラー」は、発生時に受け取った不正な値を保持できるようにしてください。 次の処理を行う呼び出し元プログラムを作成してください。 1. `20` を渡してこの処理を呼び出し、戻り値を `年齢は(値)です` の形式で出力する 2. `-5` を渡してこの処理を呼び出す ### 要件 - 2.の呼び出しで発生する「不正な年齢エラー」を捕捉し、そのエラーが保持している不正な値を使って `(値)は不正な年齢です` と出力してください。 ### 期待される結果 ``` 年齢は20です -5は不正な年齢です ```