recherche

Maison  >  Questions et réponses  >  le corps du texte

python - 为什么这段代码没有异常抛出?

In [8]: def bar():
   ...:     a = 10
   ...:     try:
   ...:         raise
   ...:     except:
   ...:         try:
   ...:             raise
   ...:         except:
   ...:             raise
   ...:     finally:
   ...:         return a


In [9]: bar()
Out[9]: 10
天蓬老师天蓬老师2787 Il y a quelques jours507

répondre à tous(2)je répondrai

  • 天蓬老师

    天蓬老师2017-04-18 10:30:05

    C'est assez intéressant, exécutons d'abord du code

    1. Ce code signifie que vous n'avez pas à vous soucier du nombre de couches d'essai dont vous disposez. En fait, il vous suffit de comprendre pourquoi les exceptions ne sont pas levées, sauf
    .
    def bar():
        a = 10
        try:
            print 1
            raise
        except:
            print 2
            raise
        finally:
            print 3
            return a
    
    bar()
    # 打印(没有抛出异常): 
    # 2
    # 3
    2. Ce code signifie que si finalement il y a une instruction return, aucune exception ne sera levée. S'il n'y a pas de retour, une exception sera levée
    .
    def bar():
        a = 10
        try:
            print 1
            raise
        except:
            print 2
            raise
        finally:
            print 3
            # return a
    bar()
    # 打印(抛出了异常):
    # 2
    # Traceback (most recent call last):
    # 3
    #   File "/Users/xuxin/workplace/DailyScript/segmentfault/file_list_to_dict.py", line 23, in <module>
    #     bar()
    #   File "/Users/xuxin/workplace/DailyScript/segmentfault/file_list_to_dict.py", line 18, in bar
    #     raise ValueError()
    # ValueError
    3. Je l'ai vérifié et vu cet article pour enfin comprendre Python.

    Il semble qu'après que f() ait lancé une exception, il exécute le retour dans except, mais il ne revient pas à l'appelant, mais "persiste" dans l'exécution du code dans finalement. À ce stade, je comprends enfin le vrai sens definally, c'est-à-dire que même si le retour a été effectué, le code final doit quand même être exécuté.

    On peut aussi comprendre ici que s'il y a une instruction qui nécessite une méthode de sortie dans try, elle tentera de s'exécuter finalement. Si elle a finalement une méthode de retour, elle reviendra immédiatement et l'instruction de sortie précédente ne sera pas exécutée.
    À ce stade, nous pouvons jeter un œil à cette chaîne de code

    def bar():
        a = 10
        try:
            print 1
            raise
        finally:
            print 3
            return a
    
    bar()
    # 打印(没有抛出异常): 
    # 3
    4. À ce stade, êtes-vous plus clair sur finalement~

    Apprenez maintenant et vendez maintenant. S'il y a des erreurs, veuillez signaler la correction~

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 10:30:05

    Si une exception est levée à la fin, votre instruction except n'est-elle pas vaine ?

    répondre
    0
  • Annulerrépondre