Как удалить "__main__."с самого начала пользовательских классов исключений в Python - PullRequest
12 голосов
/ 11 сентября 2010

Есть ли способ получить "красивее" исключение, чем одно с предваряющим __main__MyExceptionTitle?

Пример:

>>> class BadThings(Exception):
...     def __init__(self, msg):
...         self.msg = msg
...         return
... 
>>> class BadThings(Exception):
...     def __init__(self, msg):
...         self.msg = msg
...         return
...     def __str__(self):
...         return self.msg
... 
>>> raise BadThings("This is really, really bad")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.BadThings: This is really, really bad

Я бы хотел сказать:

BadThings: Это действительно очень плохо

Так же, как если бы вы печатали:

>>> raise Exception("This, too, is really, really bad")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: This, too, is really, really bad

Я бы хотел __main__. пошли!

Спасибо, Narnie

Ответы [ 4 ]

5 голосов
/ 17 октября 2013
class MyException( Exception ):
    __module__ = Exception.__module__

Этот способ выглядит / работает лучше, чем sys.excepthook


Ссылка на исходный код

Python2

См. PyErr_Display

Есть два способа обойти часть имени модуля:

class A( Exception ):
    __module__ = None

class B( Exception ):
    __module__ = 'exceptions'

Но если вам нужно поиграть с threading.Thread, первый из них представит TypeError.

Python3

См. PyErr_WriteUnraisable

Работает только второй способ.Используйте builtins вместо exceptions.

4 голосов
/ 11 сентября 2010

Я не уверен, почему вы хотите удалить __main__, потому что это имя модуля, и когда ваше исключение будет в модуле с соответствующим именем, оно будет выглядеть красиво, а не безобразно, например myexceptions.BadException

В качестве альтернативывы можете перехватывать исключения и печатать их по своему усмотрению.

Но если вы хотите, чтобы неперехваченные исключения печатались по вашему желанию, попробуйте установить sys.excepthook например

class BadThings(Exception): pass 

import traceback
def myexcepthook(type, value, tb):
    l = ''.join(traceback.format_exception(type, value, tb))
    print l

import sys
sys.excepthook = myexcepthook

raise BadThings("bad bad")

Вывод:

Traceback (most recent call last):
  File "untitled-1.py", line 12, in <module>
    raise BadThings("bad bad")
BadThings: bad bad

Таким образом, в sys.excepthook вы можете изменить исключение, отформатировать его и т. Д.

1 голос
/ 11 сентября 2010

Если вы обработаете исключение, вы можете отформатировать сообщение так, как вам нравится:

>>> try:
...     raise BadThings("This is really, really bad")
... except BadThings, e:
...     print e.msg
... 
This is really, really bad
0 голосов
/ 03 декабря 2016

Это небольшое изменение в ответе @ Anurag.

Если вы хотите избавиться от __main__. И отследить, вы можете сделать что-то вроде этого:

import sys
import traceback

class BadThings(Exception):
    def myexcepthook(type, value, tb):
        msg = ''.join(traceback.format_exception_only(type, value))
        print(msg)

    sys.excepthook = myexcepthook

raise BadThings("This is really, really bad")

Вывод:

BadThings: This is really, really bad

Дополнительным преимуществом определения sys.excepthook в классе исключений является то, что он не будет переопределять все исключения, только BadThings.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...