首页 > 解决方案 > 试图在类中引发自定义异常

问题描述

class RadiusInputError(Exception):
    pass


class Circle:
    try:
        def __init__(self, radius):
            if isinstance(radius, int):
                pass
            else:
                raise RadiusInputError
            self.radius = radius
    except RadiusInputError:
        print('Radius is not a number')


c1 = Circle('hello')

当非整数值作为半径传递时,代码应该执行 except 块,但它显示以下错误:

Traceback (most recent call last):
  File "D:/Pycharm Projects/HelloWorld/HandsOn10.py", line 17, in <module>
    c1 = Circle('hello')
  File "D:/Pycharm Projects/HelloWorld/HandsOn10.py", line 11, in __init__
    raise RadiusInputError
__main__.RadiusInputError

标签: pythonpython-3.xpython-3.6

解决方案


问题是该try/except块将只执行一次 -在此类的定义中

class Circle:
    try:
        # try to define this method
        def __init__(self, radius):
            if isinstance(radius, int):
                pass
            else:
                raise RadiusInputError
            self.radius = radius
        # if we got here, the method has been defined successfully!
    except RadiusInputError:
        # if we got here, an exception occurred WHILE DEFINING THE METHOD
        print('Radius is not a number')

此代码丝毫不会影响对的调用Circle.__init__

你可以在这里看到它是如何工作的:

>>> class Test:
...  print("before definition")
...  def __init__(self):
...    print("inside __self__")
...  print("after definition - bye!")
... 
before definition
after definition - bye!
>>> Test()
inside __self__
<__main__.Test object at 0x103541438>
>>> 

您必须在呼叫站点处理异常:

class Circle:
    def __init__(self, radius):
        if not isinstance(radius, int):
            raise RadiusInputError("Wrong radius!")
        self.radius = radius

try:
    c1 = Circle('hello')
except RadiusInputError as err:
    print(f"Oops, something went wring: {err}"!)

推荐阅读