この種のステートメントは、複数のExceptステートメントの多重処理方法です。例を通してtry...Exceptステートメントのネストを学びましょう。
deftest():n=int(input('テストするステートメントが 3 つあります。(1/2/3) を選択してください:')) ifn==1: #keyError例外 my_dict={'dotcpp':123}print ( my_dict['dot'])elifn==2:#IndexError例外my_list=[1,2,3,4,5]print(my_list[100])elifn==3:#NameError例外print('変数が存在しませんdotcpp:',dotcpp)try:try:try:test()beforeKeyError:print('KeyError 例外')beforeIndexError:print('IndexError 例外')beforeNameError:print('NameError 例外')
1/2/3 をそれぞれテストし、出力結果は次のとおりです。
テストするステートメントが 3 つあります。選択してください (1/2/3): 1KeyError 例外 テストするステートメントが 3 つあります。選択してください (1/2/3): 2IndexError 例外 テストするステートメントが 3 つあります。選択してください(1/ 2/3): 3NameError 例外
この例では、まず定義された関数に判定 n を入力し、次に n の値に基づいて 3 つの例外状況を与え、最後に 3 つの try..Except ステートメントをネストします。つまり、 test() ステートメントは 3 つのレベルの判定を経ます。
完全な例外処理メカニズムは、 finallyステートメントと切り離すことができません。このステートメントの機能は、プログラムで例外が発生したかどうかに関係なく、finally ステートメントのコードが実行されることです。
try:blockexcel[typeerror]:deal1finally:deal2
例を通してこの構造を見てみましょう。
deftest():n=int(input('整数を入力してください:'))print(n)try:test()beforeKeyError:print('KeyError例外')finally:print('最後にステートメントが実行されました')
6 と dotcpp をそれぞれ入力して出力を確認してみましょう。
整数を入力してください: 55finally ステートメントが実行されました 整数を入力してください: dotcppfinally ステートメントが実行されました Traceback(mostrecentcalllast):FileC:/Users/test.py,line5,in<module>test()FileC:/Users/test. py, line2,intestn=int(input('整数を入力してください:'))ValueError:invalidliteralforint()withbase10:'dotcpp'
この例から、プログラムで例外が発生したかどうかに関係なく、finally ステートメントが実行されることがわかります。
上で学習したfinallyステートメントは、ステートメント内で例外が発生したかどうかに関係なく実行されるステートメントです。以下で学習したtry...excel...elseステートメントは、プログラム内で例外が発生しなかった場合にのみ実行されます。その構文構造は次のとおりです。
try:blockexcel[typeerror]:deal1else:deal2
以下の例を見てみましょう。
deftest():n=int(input('整数を入力してください:'))print('入力値は次のとおりです:',n)try:test()beforeValueError:print('ValueError例外')else:print('現在のプログラムで例外は発生しませんでした')
出力は次のとおりです。
整数を入力してください: 5。入力値は: 5 です。現在のプログラムには例外はありません。
値 dotcpp を入力すると
整数を入力してください: dotcppValueError 例外
プログラムが異常な場合、else ステートメントが実行されないことがわかります。これらの一般的に使用される例外処理ステートメントを例を通して練習することができます。