2

我有以下代码示例,

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 类中使用 use 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()
4

3 回答 3

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()
于 2013-10-08T16:26:12.637 回答
1

在调用方法时会查找名称InnerException,因此异常名称是非本地值。你可以写

class Outer:
    class InnerException(Exception): pass

    # methods

InnerException = Outer.InnerException

但这首先破坏了InnerException在类内部定义的目的Outer。你可以很容易地写

class Outer:
    # methods

class InnerException(Exception): pass

因为两者都使名称InnerException引用模块范围内的异常(尽管在第二种情况下,当然InnerException不再是 的类属性Outer)。

于 2013-10-08T16:25:43.933 回答
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()
于 2013-10-08T18:18:57.573 回答