/ / Prečo nemôžem vyvolať výnimku po tom, čo som ju vylúčil? - python, výnimka, rozsah

Prečo nemôžem vyvolať výnimku po tom, ako som ju vylúčil? - python, výnimka, rozsah

Prečo nemôžem zvýšiť inštanciu výnimky potom, čo som chytil túto triedu výnimiek? Je to zvláštne, že narazím na túto chybu, keď spúšťam skript z funkcie, ale nie pri behu priamo v shell pytón.

In [2]: def do():
...:     try:
...:         raise ValueError("yofoo")
...:     except TypeError, ValueError:
...:         raise ValueError("yo")
...:

In [3]: do()
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-3-30c46b84d9a4> in <module>()
----> 1 do()

<ipython-input-2-b62158d6343b> in do()
1 def do():
2     try:
----> 3         raise ValueError("yofoo")
4     except TypeError, ValueError:
5         raise ValueError("yo")

UnboundLocalError: local variable "ValueError" referenced before assignment

Očakávaná chyba tu:

In [3]: try:
...:     raise ValueError("foo")
...: except ValueError:
...:     raise ValueError("bar")
...:
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-d5c83419a5ea> in <module>()
2     raise ValueError("foo")
3 except ValueError:
----> 4     raise ValueError("bar")
5

ValueError: bar

odpovede:

9 pre odpoveď č. 1
except TypeError, ValueError:

by mala byť

except (TypeError, ValueError):

Keď používate except TypeError, ValueError:, priradíte inštancii výnimky názvu premennej ValueError.

So súčasným kódom, keď Python analyzuje do funkcie, poznamenáva ValueError je lokálna premenná, pretože except TypeError, ValueError: priradí hodnotu ValueError, Ale keď to spomeniete v prvej try-suite, s raise ValueError("yofoo"), miestna premenná ValueError nemá žiadnu hodnotu. Takže dostanete UnboundLocalError.


z dokumenty:

... except (RuntimeError, TypeError, NameError):
...     pass

Všimnite si, že zátvorky okolo tejto n-tice súpožadované, pretože okrem hodnoty ValueError, e: bola syntax použitá pre to, čo je normálne napísané ako okrem ValueError ako e: v modernom Pythone (popísané nižšie). Starý syntax je stále podporovaný pre spätnú kompatibilitu. To znamená okrem RuntimeError, TypeError nie je ekvivalentný okrem (RuntimeError, TypeError): ale s výnimkou RuntimeError ako TypeError: čo nie je to, čo chcete.