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ď č. 1except 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.