我有以下代码示例,
class Outer:
class InnerException(Exception): pass
def raise_inner(self):
raise Outer.InnerException()
def call_raise(self):
try:
self.raise_inner()
except Outer.InnerException as e:
print "Handle me"
Outer().call_raise()
我希望做的不是使用Outer.InnerException
而只是在Outer类中使用InnerException
,简而言之就是这样
class Outer:
class InnerException(Exception): pass
#InnerException = Outer.InnerException .. something like this, create some alias
def raise_inner(self):
raise InnerException()
def call_raise(self):
try:
self.raise_inner()
except InnerException as e:
print "Handle me"
Outer().call_raise()
答案 0 :(得分:3)
您不能仅使用名称引用在类范围内声明的内容(除非您在类范围内也这样做)。
要么:
class Outer:
class InnerException(Exception): pass
def raise_inner(self):
raise self.InnerException()
或
class InnerException(Exception): pass
class Outer:
def raise_inner(self):
raise InnerException()
答案 1 :(得分:1)
在调用方法时查找名称InnerException
,因此异常名称是非本地值。你可以写
class Outer:
class InnerException(Exception): pass
# methods
InnerException = Outer.InnerException
但这首先违背了在InnerException
类中定义Outer
的目的。你可以轻松地写
class Outer:
# methods
class InnerException(Exception): pass
因为两者都使名称InnerException
引用模块范围中的异常(尽管在第二种情况下,InnerException
不再是Outer
的类属性,当然)。
答案 2 :(得分:1)
我想你可以做这样的事情来在每个函数的封闭范围内定义它,这会创建一个局部变量,它是它的别名:
class Outer:
class InnerException(Exception): pass
def raise_inner(self, InnerException=InnerException):
raise InnerException()
def call_raise(self, InnerException=InnerException):
try:
self.raise_inner()
except InnerException as e:
print "Handle me"
Outer().call_raise()