Python: Могу ли я перегрузить оператор поднятия с помощью def __raise __ (self) :? - PullRequest
4 голосов
/ 02 февраля 2010

Вот мой класс исключений, использующий повышение :

class SCE(Exception):
    """
    An error while performing SCE functions.
    """
    def __init__(self, value=None):
        """
        Message: A string message or an iterable of strings.
        """
        if value is None:
            self._values = []
        elif isinstance(value, str):
            self._values = [value]
        else:
            self._values = list(value)

    def __raise__(self):
        print('raising')
        if not len(self._values):
            return

    def __str__(self):
        return self.__repr__()

    def __iter__(self):
        return iter(self._values)

    def __repr__(self):
        return repr(self._values)

В настоящее время, если я возбуждаю это исключение без значения, я получаю traceback с последующим:

__main__.SCE: []

Вместо того, что я ожидал, это было:

raising
>>>

Как перегрузить raise?

Ответы [ 3 ]

3 голосов
/ 02 февраля 2010

Как говорится в другом ответе, __raise__ специального метода не существует. В 2004 году на comp.lang.python была тема, в которой кто-то предлагал добавить такой метод, но я не думаю, что было какое-то продолжение этого. Единственный способ, которым я могу придумать, чтобы перехватить исключение, это либо пропатчить интерпретатор, либо переписать какой-либо источник или байт-код, который вставляет вызов функции рядом с операцией вызова.

1 голос
/ 02 февраля 2010

Нет такого специального метода __raise__ (по крайней мере, такого, о котором я когда-либо слышал или который я могу найти в документации Python ).

Почему ты хочешь это сделать? Я не могу придумать причину, по которой вы хотите, чтобы пользовательский код выполнялся при возникновении исключения (в отличие от того, когда создается исключение, что вы можете сделать с помощью метода __init__, или когда перехватывается исключение что вы можете сделать с блоком except). Каков ваш вариант использования для этого поведения, и почему вы ожидаете, что Python его поддерживает?

0 голосов
/ 28 июня 2019

Как уже говорили другие, такого частного метода не существует __raise__. Ничто не мешает определить одно. Например:

#!/usr/bin/env python3


class MyClass(object):
    def __init__(self, raise_exceptions=False):
        self.raise_exceptions = raise_exceptions

    def __raise__(self, err=None):
        print(err, flush=True)
        if self.raise_exceptions:
            raise err

    def run(self):
        try:
            assert False, 'assertion False'
        except Exception as err:
            self.__raise__(err)


if __name__ == '__main__':
    MyClass(raise_exceptions=False).run()
    MyClass(raise_exceptions=True).run()

Вот вывод:

$ python3 my_class.py
assertion False
assertion False
Traceback (most recent call last):
  File "my_class.py", line 22, in <module>
    MyClass(raise_exceptions=True).run()
  File "my_class.py", line 17, in run
    self.__raise__(err)
  File "my_class.py", line 11, in __raise__
    raise err
  File "my_class.py", line 15, in run
    assert False, 'assertion False'
AssertionError: assertion False

Process finished with exit code 1
...