2016-01-08 2 views
3

Что я должен определить в своем классе исключения, чтобы оболочка могла его напечатать значимым образом? Я попробовал следующее:В python, как я могу заставить свои собственные классы исключений печатать в оболочке?

#!/usr/bin/env python3.4 

class MyError(Exception): 
    def __init__(self, myparam1, myparam2): 
     self.myparam1 = myparam1 
     self.myparam2 = myparam2 


    def __str__(self): 
     return 'param1: {0}, param2: {1}'.format(self.param1, self.param2) 


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


if __name__ == "__main__": 
    raise MyError(1, 2) 

, который дает мне

Traceback (most recent call last): 
    File "./tmp.py", line 18, in <module> 
    raise MyError(1, 2) 
__main__.MyError 

То, что я хотел бы видеть, что есть результат __str__ вызова.

ответ

3

Метод __init__ в Exception принимает сообщение об ошибке как параметр. Вы можете вызвать его из своего метода __init__.

class MyError(Exception): 
    def __init__(self, param1, param2): 
     super(MyError, self).__init__('param1: {0}, param2: {1}'.format(param1, param2)) 

>>> raise MyError(1,2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
__main__.MyError: param1: 1, param2: 2 

Или, если вы хотите, чтобы полагаться на __str__ метод, за исключением, чтобы обеспечить сообщение, вы можете передать сам экземпляр исключения, как сообщение для суперкласса __init__:

class MyError(Exception): 
    def __init__(self, myparam1, myparam2): 
     super(MyError, self).__init__(self) 
     self.myparam1 = myparam1 
     self.myparam2 = myparam2 
    def __str__(self): 
     return 'param1: {0}, param2: {1}'.format(self.myparam1, self.myparam2) 
    def __repr__(self): 
     return str(self) 
Смежные вопросы