У меня есть несколько пользовательских исключений, созданных для моего проекта Django. вот так

< Сильный > errors.py

# General Exceptions

class VersionError(Exception):
    pass

class ParseError(Exception):
    pass

class ConfigError(Exception):
    pass

class InstallError(Exception):
    pass

Однако я хочу напечатать вывод из моих пользовательских исключений, но не общего. Но не хочу перечислять их всех, т.е.

try:
   do something wrong
except <custom errors>, exc:
    print exc
except:
    print "Gen
1
felix001 16 Дек 2015 в 11:42

5 ответов

Лучший ответ

Каноническим способом было бы создать общий суперкласс для всех ваших исключений.

# General Exceptions
class MyAppError(Exception):
    pass

class VersionError(MyAppError):
    pass

class ParseError(MyAppError):
    pass

class ConfigError(MyAppError):
    pass

class InstallError(MyAppError):
    pass

С этим наследованием три вы можете просто перехватить все исключения типа MyAppError.

try:
    do_something()
except MyAppError as e:
    print e
2
Łukasz Rogalski 16 Дек 2015 в 08:48

Создайте пользовательское базовое исключение и извлеките все другие пользовательские исключения из этого базового исключения:


class CustomBaseException(Exception):
    pass

# General Exceptions

class VersionError(CustomBaseException):
    pass

class ParseError(CustomBaseException):
    pass

class ConfigError(CustomBaseException):
    pass

class InstallError(CustomBaseException):
    pass

Тогда ты можешь сделать


try:
   do something wrong
except CustomBaseExecption, exc:
    print exc
except:
    print "Gen
0
Sebastian Stigler 16 Дек 2015 в 08:47

Вы должны определить пользовательский базовый класс маркера для ваших пользовательских исключений:

# General Exceptions
class MyException(Exception):
    """Just a marker base class"""

class VersionError(MyException):
    pass

class ParseError(MyException):
    pass

class ConfigError(MyException):
    pass

class InstallError(MyException):
    pass

С этой модификацией вы можете легко сказать:

try:
   do something wrong
except MyException as exc:
    print exc
except:
    print "Some other generic exception was raised"

(Кстати, вы должны использовать рекомендованный except Exception as ex синтаксис вместо except Exception, ex, см. этом вопросе для деталей)

1
Community 23 Май 2017 в 11:52

Вы можете сделать кортеж из исключений:

my_exceptions = (VersionError,
                 ParseError,
                 ConfigError,
                 InstallError)

Применение:

except my_exceptions as exception:
    print exception

Например:

>>> my_exceptions = (LookupError, ValueError, TypeError)
>>> try:
...     int('a')
... except my_exceptions as exception:
...     print type(exception)
...     print exception
<type 'exceptions.ValueError'>
invalid literal for int() with base 10: 'a'
1
Peter Wood 16 Дек 2015 в 10:12

Вы должны создать общий базовый класс для всех ваших пользовательских исключений и поймать это.

0
John Zwinck 16 Дек 2015 в 08:45