Python入門トップページ


目次

  1. プログラミング言語
  2. Anaconda - Jupyter Notebook / JupyterLab の環境設定
  3. Python の基礎
  4. リスト,タプル,辞書,集合
  5. 再び Jupyter Notebook の操作
  6. Python の制御構文
  7. 関数
  8. 便利な関数など
  9. リストの内包表記
  10. 多次元リスト
  11. クラス
  12. 演習問題
  13. 雑多な情報
    • 例外処理を行う

Python の基礎

雑多な情報

例外処理を行う

ここで説明したように,例えば scores リストから取り出して表示したい要素のインデックスをキーボードから入力し続け,「q」が入力されたら処理を終了するようなプログラムを考えます.このプログラムに対してユーザが期待通りの入力作業を行うとプログラムは正常に動作します.


scores = [10, 30, 25, 20]
while True:
    x = input(f'0 から {len(scores)-1} までの整数を入力してください(qで終了します): ')
    if x == 'q':
        break
    pos = int(x)
    print(scores[pos])
print('終了しました')
0 から 3 までの整数を入力してください(qで終了します): 0 ⏎
10
0 から 3 までの整数を入力してください(qで終了します): 1 ⏎
30
0 から 3 までの整数を入力してください(qで終了します): -2 ⏎
25
0 から 3 までの整数を入力してください(qで終了します): 3 ⏎
20
0 から 3 までの整数を入力してください(qで終了します): q ⏎
終了しました

しかしながら,ユーザが 4 という入力を与えた場合には 7 行目の IndexError によりプログラムが停止,それ以降の処理は行われません.

0 から 3 までの整数を入力してください(qで終了します): 0 ⏎
10
0 から 3 までの整数を入力してください(qで終了します): 1 ⏎
30
0 から 3 までの整数を入力してください(qで終了します): 2 ⏎
25
0 から 3 までの整数を入力してください(qで終了します): 3 ⏎
20
0 から 3 までの整数を入力してください(qで終了します): 4 ⏎
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [17], in <cell line: 3>()
      5         break
      6     pos = int(x)
----> 7     print(scores[pos])
      8 print('終了しました')

IndexError: list index out of range

また,ユーザが a という入力を与えた場合には 6 行目の ValueError によりプログラムが停止,それ以降の処理は行われません.

0 から 3 までの整数を入力してください(qで終了します): 0 ⏎
10
0 から 3 までの整数を入力してください(qで終了します): a ⏎
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [14], in <cell line: 3>()
      4     if x == 'q':
      5         break
----> 6     pos = int(x)
      7     print(scores[pos])
      8 print('終了しました')

ValueError: invalid literal for int() with base 10: 'a'

Python ではエラー(例外)が起こる可能性がある場所を try の中に記述し,except によって例外を処理することでプログラムの強制終了を避け,例外の内容をユーザに通知することができるようになります.

次のコードでは,何らかの例外が発生したことだけをキャッチしてユーザに通知するとともに,強制終了せずに処理を継続します.具体的には,try のブロックに含まれる 7 行目と 8 行目の処理が実行され,もしもそこで例外が発生すると except のブロックが実行されることになります.


scores = [10, 30, 25, 20]
while True:
    x = input(f'0 から {len(scores)-1} までの整数を入力してください(qで終了します): ')
    if x == 'q':
        break
    try:
        pos = int(x)
        print(scores[pos])
    except:
        print('何らかの例外が発生しました')
print('終了しました')
0 から 3 までの整数を入力してください(qで終了します): 0 ⏎
10
0 から 3 までの整数を入力してください(qで終了します): 2 ⏎
25
0 から 3 までの整数を入力してください(qで終了します): 4 ⏎
何らかの例外が発生しました
0 から 3 までの整数を入力してください(qで終了します): a ⏎
何らかの例外が発生しました
0 から 3 までの整数を入力してください(qで終了します): q ⏎
終了しました

さらに,具体的な例外の種類についても取得して,その種類によって処理の内容を変えることもできます.例えば,次の例では IndexErrorValueError について特別な処理を記述し,それ以外の例外についてもエラーメッセージを表示させます.


scores = [10, 30, 25, 20]
while True:
    x = input(f'0 から {len(scores)-1} までの整数を入力してください(qで終了します): ')
    if x == 'q':
        break
    try:
        pos = int(x)
        print(scores[pos])
    except ValueError as val_err:
        print(f'整数ではありません : {val_err}')
    except IndexError as idx_err:
        print(f'入力された数値は0から{len(scores)-1}までの整数ではありません : {idx_err}')
    except Exception as other_err:
        print(f'何らかの例外が発生しました : {other_err}')
print('終了しました')
0 から 3 までの整数を入力してください(qで終了します):  0 ⏎
10
0 から 3 までの整数を入力してください(qで終了します):  2.0 ⏎
整数ではありません : invalid literal for int() with base 10: '2.0'
0 から 3 までの整数を入力してください(qで終了します):  2 ⏎
25
0 から 3 までの整数を入力してください(qで終了します):  a ⏎
整数ではありません : invalid literal for int() with base 10: 'a'
0 から 3 までの整数を入力してください(qで終了します):  4 ⏎
入力された数値は0から3までの整数ではありません : list index out of range
0 から 3 までの整数を入力してください(qで終了します):  3 ⏎
20
0 から 3 までの整数を入力してください(qで終了します):  q ⏎
終了しました

なお,上のコードで print(f'...{変数名}...')f 文字列です.

目次に戻る