基礎・上級問題チェック

問題 12 /40

次のコードを実行したときの処理として、正しいものはどれか。

import requests

url = 'https://www.google.com/'

for count in range(3):
    try:
        requests.get(url)
        print('success')
    except Exception:
        print('error')
    else:
        break
else:
    print('final')

選択 1

1回目でurlへのリクエストが成功すると、「success」と「final」が表示される。

選択 2

1回目でurlへのリクエストが成功すると、「success」だけ表示される。

選択 3

urlへのリクエストを3回繰り返してすべて失敗すると、「error」が3回表示され、「final」は表示されない。

選択 4

urlへのリクエストが2回目で成功すると、「success」だけ表示される。

解説

選択肢2が正解です。

問題文のコードはリトライ処理の書き方の一例です。

-------------------------------
import requests
# requestsのライブラリを読み込んでいます。


url = 'https://www.google.com/'
# 変数urlにGoogleのURLを代入しています。


for count in range(3):
# 最初のトライを含めて、合計3回トライする場合の書き方です。変数の「count」は「0 1 2」が順番に代入されますが、これは別の場所で使うわけではなく、for文の中の処理を3回繰り返すための役割です。


    try:
        requests.get(url)
        print('success')
# try節の処理が成功すると、後続のexecpt節は実行されません。


    except Exception:
        print('error')
# try節が失敗すると実行されます。except節の処理が実行されると直下のelse節は実行されず、for文に戻ってtry節に続きます。


    else:
        break
# try節が成功したときだけ実行され、for文を抜けます。


else:
    print('final')
# このelse節はtry文ではなくfor文のelse節です。for文のelse節はif文のelse節と違い、for文のループ処理が終了した後にelse節が実行されます。ただし、for文がbreak文で終了した場合は、else節が実行されません。問題文の場合、try節が成功した場合は実行されません。try節を3回繰り返し、すべて失敗した場合だけ実行されます。

-------------------------------

ポイントはelseとbreakの使い方です。

なお、requestsは外部ライブラリで、基礎試験の範囲外です。

(公式書籍 p.26-27)