例外キャプチャに関するちょっとした知識 - try、excel は関数の内部と外部に記述されています

この記事では主にtry、excel、関数を組み合わせて使用​​する場合の2つの状況について説明します。

1 回の試行(関数内を除く)

ご存知のとおり、try ステートメントとExcept ステートメントは、プログラムの堅牢性と安定性を高めるために例外をキャッチするために使用されます。これは、例外がキャッチされた後も次のコードは通常どおり実行できるため、プログラムがエラーをスローするよりもはるかに優れています。 。次のコードを見てみましょう。

def demo1():
    try:
        print('我正在执行demo1函数')
        raise Exception('查看报错是否返回到函数调用处')
        # int(input('请输入一个整数: '))
    except Exception as result:
        print('我进来了except里')
        # raise result


def demo2():
    return demo1()


try:
    print(demo2())
except ValueError:
    print('请输入正确的整数')
except Exception as result:
    print(f'未知错误{
      
      result}')

ここに画像の説明を挿入
ブレークポイントの後に、コードの実行シーケンスが表示されます。 1 11 15 16 12 は最初と 2 番目の文を出力します。 12 16 は None を出力します。コードは、demo1 で print('デモ1 関数を実行しています') を実行し、その後、例外がアクティブにスローされるため、raise Exception('関数呼び出しにエラーが返されるかどうかを確認します') を実行していることがわかります。 6 番目の文の例外キャプチャでは、当然のことながら 7 番目の文が実行されます。そして、関数呼び出しの12文目に戻りますが、このときdemo1の実行後にreturnがないので、12行目は実際にはreturn Noneになっていますが、再度demo2関数を実行し、12行目で停止してから、関数呼び出しに戻る 16行目では、demo2でreturn Noneを記述しているため、最終出力はdemo2実行後の結果Noneになります。

ここで注意しなければならないのは、

(1) 関数内にtryとexcelを記述する場合は、tryとexcelの両方にraiseを記述する必要があることに注意してください。それ以外の場合、エラーが発生すると、関数は何も返さず、発生したエラーも返さず、関数呼び出しは None を受け取ります。これは、何もせずに関数を実行することと同じです。役立つものは何も返されず、エラー メッセージも返されませんでした。
(2) try と else が関数内に記述されている場合、プログラムは try の実行時にエラーを報告するか、raise を使用して積極的に例外をスローします。この例外は、エラーとして Exception でキャプチャできます。すると、「それはナンセンスではないか、try で報告されたエラーは、Except に移動するはずだ」と思う人もいるかもしれません。しかし、try とExcept が関数の外にある場合、Except には移動しません。代わりに、関数呼び出しに戻ります。
ここに画像の説明を挿入
8行目が解放されると、関数の実行順序は 1. 11 15. 16 12 出力文後、しばらく12が留まる 16 17. 19. 20 となっていることがわかります。つまり、demo1 が実行された後、demo1 は呼び出し元の関数が呼び出された場所にエラー レポートを返します。つまり、demo2 では実際には次のようになります。 return '関数呼び出しにエラー メッセージが返されるかどうかを確認します。 '、つまり、demo1 によってスローされた結果は、demo2 に渡されます。その後、demo2 が実行され、関数呼び出しの 16 行目に戻ります。try でエラーが発生し、Except に進みます。最初の例外エラーのタイプは一致しません。したがって、2 番目の例外に進み、最終的にデモ 1 のエラー メッセージが渡され、20 行が与えられ、エラー メッセージが出力されます。

2 関数外を除いて試してみる

try:
    def demo1():
        print('我正在执行demo1函数')
        raise Exception('查看报错是否返回到函数调用处')
        # int(input('请输入一个整数: '))
except Exception as result:
    print('我进来了except里')
    raise result


def demo2():
    return demo1()


try:
    print(demo2())
except ValueError:
    print('请输入正确的整数')
except Exception as result:
    print(f'未知错误{
      
      result}')

ここに画像の説明を挿入
9 行目の実行後、コードは 17 行目に直接ジャンプします。これは、try が関数の外に記述されている場合、例外は推移的であり、例外に行かずに呼び出し元の関数に直接戻るためです。
次に、demo2 が初めて呼び出された行 21 に戻ります。21 行目を実行するとエラーが返されるため (これもエラーがあるため、何も返されません。None を返すということは、関数がエラーを報告しておらず、戻り値がないことを意味します。 None を返します。None さえ返さない場合は、エラーが報告されていることを意味します。) そこで、例外に進み、例外の種類を照合した後、不明なエラーが出力されました...

おすすめ

転載: blog.csdn.net/simpleness_/article/details/128007831