diff Lib/exceptions.py @ 11030:3be935be3781 legacy-trunk

Patch by Tim Peters: Introduce a new builtin exception, UnboundLocalError, raised when ceval.c tries to retrieve or delete a local name that isn't bound to a value. Currently raises NameError, which makes this behavior a FAQ since the same error is raised for "missing" global names too: when the user has a global of the same name as the unbound local, NameError makes no sense to them. Even in the absence of shadowing, knowing whether a bogus name is local or global is a real aid to quick understanding. Example: D:\src\PCbuild>type local.py x = 42 def f(): print x x = 13 return x f() D:\src\PCbuild>python local.py Traceback (innermost last): File "local.py", line 8, in ? f() File "local.py", line 4, in f print x UnboundLocalError: x D:\src\PCbuild> Note that UnboundLocalError is a subclass of NameError, for compatibility with existing class-exception code that may be trying to catch this as a NameError. Unfortunately, I see no way to make this wholly compatible with -X (see comments in bltinmodule.c): under -X, [UnboundLocalError is an alias for NameError --GvR]. [The ceval.c patch differs slightly from the second version that Tim submitted; I decided not to raise UnboundLocalError for DELETE_NAME, only for DELETE_LOCAL. DELETE_NAME is only generated at the module level, and since at that level a NameError is raised for referencing an undefined name, it should also be raised for deleting one.]
author Guido van Rossum <guido@python.org>
date Tue, 22 Jun 1999 14:47:32 +0000
parents 9be2726c9b25
children eaf9eeab3bcf
line wrap: on
line diff
--- a/Lib/exceptions.py	Mon Jun 21 22:36:53 1999 +0000
+++ b/Lib/exceptions.py	Tue Jun 22 14:47:32 1999 +0000
@@ -40,6 +40,8 @@
       |    +-- NotImplementedError(*)
       |
       +-- NameError
+      |    |
+      |    +-- UnboundLocalError(*)
       +-- AttributeError
       +-- SyntaxError
       +-- TypeError
@@ -208,7 +210,11 @@
     pass
 
 class NameError(StandardError):
-    """Name not found locally or globally."""
+    """Name not found globally."""
+    pass
+
+class UnboundLocalError(NameError):
+    """Local name referenced but not bound to a value."""
     pass
 
 class MemoryError(StandardError):