Попытка вызвать пользовательское исключение в классе - PullRequest
0 голосов
/ 05 апреля 2020
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')

код должен выполнять блок исключений, когда в качестве радиуса передается нецелое значение, но отображается следующая ошибка:

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

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Вы поместили объявление функции __init__() в блок try/except, но объявление функции не может вызвать исключение.

Следует учитывать одно из следующих действий:

  1. оберните содержимое __init__ fun c в try/except:
class Circle:
    def __init__(self, radius):
        try:
            if isinstance(radius, int):
                pass
            else:
                raise RadiusInputError
            self.radius = radius
        except RadiusInputError:
            print('Radius is not a number')


Завершение инициализации объекта:
class Circle:
    def __init__(self, radius):
        if isinstance(radius, int):
            pass
        else:
            raise RadiusInputError
        self.radius = radius


try:
    c1 = Circle('hello')
except RadiusInputError:
    print('Radius is not a number')
0 голосов
/ 05 апреля 2020

Проблема в том, что блок 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}"!)
...