練習問題 解答
8.6 練習問題 解答
問1
① ×:対応する例外クラスがexceptブロックに設定されていないと処理は行われない。
② ○:finallyブロックは、例外発生の有無に関わらず必ず処理されます。
③ ×:複数のexceptブロックを指定することができます。
④ ○:変数から例外クラスの情報を取得することができます。
⑤ ○
問2
③ 「Yellow」を表示する前の処理で例外が発生します。
問3
① ×:この例外が発生するクラスは利用していない。
② ○:入力数値が無い(1回目で999を入力)場合発生します。
③ ○:1つ目の繰り返し処理の条件が間違っているため、4回目の数値入力で発生します。
④ 〇:input関数で入力した値をint関数で型を変換しているため、数字以外の文字列を入力した場合に発生します。
問4
1 | cnt = 0 |
2 | total = 0 |
3 | ave = 0 |
4 | num = [0,1,2] |
5 |
6 | #繰り返し処理(配列の要素数分) |
7 | while True: |
8 | try: |
9 | #キーボードより数値を入力し配列に格納 |
10 | tmpNum = int(input('数値を入力して下さい。(999で強制終了)>')) |
11 |
12 | #入力数値が999なら強制でループを抜ける |
13 | if tmpNum == 999: |
14 | break |
15 | elif tmpNum < 999: |
16 | num[cnt] = tmpNum |
17 | cnt += 1 |
18 | else: |
19 | num[cnt] = tmpNum |
20 |
21 | for i in range(cnt): |
22 | total += num[i] |
23 |
24 | ave = total/cnt |
25 |
26 | print('入力数は',cnt, 'です。') |
27 | print('合計点は',total,'です。') |
28 | print('平均点は',ave ,'です。') |
29 |
30 | except ValueError: |
31 | print('文字が出力されました。数値を入力してください。') |
解説
まずはwhileブロック内の処理全てをtryブロックで囲んでいます。そしてexcept内に処理する例外クラス「ValueError」を指定しています。
exceptブロックの処理が終っても処理自体がwhile内なので、繰り返し処理の先頭に戻り再入力を促します。
問5
1 | cnt = 0 |
2 | total = 0 |
3 | ave = 0 |
4 | num = [0,1,2] |
5 |
6 | #繰り返し処理(配列の要素数分) |
7 | while True: |
8 | try: |
9 | #キーボードより数値を入力し配列に格納 |
10 | tmpNum = int(input('数値を入力して下さい。(999で強制終了)>')) |
11 |
12 | #入力数値が999なら強制でループを抜ける |
13 | if tmpNum == 999: |
14 | break |
15 | elif tmpNum < 999: |
16 | num[cnt] = tmpNum |
17 | cnt += 1 |
18 | else: |
19 | num[cnt] = tmpNum |
20 |
21 | for i in range(cnt): |
22 | total += num[i] |
23 |
24 | ave = total/cnt |
25 |
26 | print('入力数は',cnt, 'です。') |
27 | print('合計点は',total,'です。') |
28 | print('平均点は',ave ,'です。') |
29 |
30 | except ValueError: |
31 | print('文字が出力されました。数値を入力してください。') |
32 | except ZeroDivisionError as e: |
33 | print('エラーの原因は',e,'です。') |
34 | except IndexError as e: |
35 | print('エラーの原因は',e,'です。') |
解説
複数のexceptを設け、ValueErrorに加え、ZeroDivisionError、IndexErrorを指定しており、exceptブロック内では例外のインスタンスを指し示す変数「e」を利用して、例外の詳細情報を画面に表示します。except以降の処理は無いのでこのまま処理が終了します。