Как узнать, является ли исключение встроенным или определенным пользователем в Python - PullRequest
1 голос
/ 20 марта 2019

У меня есть свои собственные классы исключений, унаследованные от класса Exception.Я мог бы проверить, если тип in {..my exceptions list..}, но это кажется проблематичным в моем случае.Есть ли другой способ проверить, является ли исключение пользовательским или встроенным в Python.Спасибо!

РЕДАКТИРОВАТЬ: Проблема в том, что другие могут записывать свои собственные исключения или переименовывать существующие исключения в свои файлы, которые я не могу отследить.Мне нужно регистрировать встроенные исключения и игнорировать исключения, возникшие по вине пользователя.Мне нужна регистрация, кроме блока

try:
    # something
except Exception as god_knows_what_ex:
    # check if built-in

Ответы [ 4 ]

2 голосов
/ 20 марта 2019

Вы можете создать свой собственный класс исключений, который наследует от Exception, и ваши текущие классы исключений наследуют от него.

В общем:

Exception
 - MyExceptionClass
    - MyExceptionClass1
    - MyExceptionClass2
 - Built-in exceptions

Таким образом, вы можетепроверьте, является ли исключение экземпляром вашего MyExceptionClass.

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

try:
    method_that_can_throw_an_exception()
except MyExceptionClass:
    print('User-defined exception thrown')
1 голос
/ 20 марта 2019

Хорошим дизайном для этого случая является определение базового исключения для вашего класса. Если кто-то хочет расширить ваш модуль, в вашей документации должно быть четко указано, что он должен использовать ваш тип исключения или расширить его. Используйте базовый класс для создания UserException. В коде регистрации игнорируйте UserException и регистрируйте все остальное.

Документирование этого поведения.

Ваш подход, вероятно, не сработает. Вы можете начать с этого:

ex.__class__.__module__

, который вернет __builtin__ для предопределенных исключений, но не для тех, которые определены в стандартных модулях Python (* .py файлы в библиотеке).

Кроме того, как вы планируете поддерживать исключения, определенные другими модулями, которые пользователи вашего кода установили с pip?

1 голос
/ 20 марта 2019

Я подозреваю, что этот вопрос связан с тем, что ваш код имеет следующий анти-шаблон:

try:
    # bad code
except Exception as e:
    # catch all exceptions in the world, and try to
    # understand the type of e in superfluous ways

Вы не должны (обычно) проверять type исключения, вместо этого вы должныиспользуйте except с минимальным подмножеством соответствующих типов исключений:


try:
    # bad code
except (CustomException1, CustomException2):
    # handle exception

Или, если для каждого типа исключения требуется отдельная обработка:

try:
    # bad code
except CustomException1:
    # handle CustomException1
except CustomException2:
    # handle CustomException2
0 голосов
/ 20 марта 2019

Хотя причины этого вопроса сомнительны, вот альтернатива, которая:

code.py

#!/usr/bin/env python3

import sys
import json


class UserError:
    pass


class UserException(BaseException):
    pass


def builtin_exc(exc_inst):
    return getattr(getattr(exc_inst, "__class__", None), "__module__", None) == "builtins"


def main():
    user_err = UserError()
    user_exc = UserException()
    base_exc = BaseException()
    exc = Exception()
    ni_err = NotImplementedError()
    jsdec_err = json.JSONDecodeError("", "", 0)
    for item in [user_err, user_exc, base_exc, exc, ni_err, jsdec_err]:
        print("'{:s}' is builtin: {:}".format(item.__class__.__name__, builtin_exc(item)))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

выход

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055262562]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32

'UserError' is builtin: False
'UserException' is builtin: False
'BaseException' is builtin: True
'Exception' is builtin: True
'NotImplementedError' is builtin: True
'JSONDecodeError' is builtin: False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...