2015-10-30 6 views
3

Я пытаюсь добавить текст для всех ошибок утверждения в моем коде.Настроить AssertionError в Python

Это мой код:

class AssertionError(Exception): 
    def __init__(self, msg): 
     Exception.__init__(self, msg) 
     self.message = msg + "+ SOME TEXT" 

assert 1 == 2, "FAIL" 

Результат

__main__.AssertionError: FAIL 

Я ожидал увидеть результат: "FAIL + НЕКОТОРЫХ TEXT"


Проблема с UnitTest также. Я хочу добавить текст для всех неудавшихся тестов (без обновления всего текстового сообщения).

import unittest 

class TestCase(unittest.TestCase): 
    def test1(self): 
     self.assertTrue(False, "FAIL!") 

    def test2(self): 
     self.assertLessEqual(10, 2, "FAIL!") 

if __name__ == "__main__": 
    unittest.main() 
+0

Если один из ответов ниже исправляет проблему, вы должны (нажмите галочку рядом с соответствующим ответом). Это делает две вещи. Это позволяет всем знать, что ваша проблема решена до вашего уровня удовлетворенности, и это дает человеку, который помогает вам кредитовать помощь. [См. Здесь] (http://meta.stackexchange.com/a/5235) для полного объяснения. –

+0

Похоже, что он не работает с unittest. Если я не сработал, я не вижу дополнительной информации. – Helga

ответ

1

Проблема в том, что вы ничего не делаете с self.message = msg + "+ SOME TEXT". Вам необходимо передать пользовательское сообщение, которое вы хотите: Exception.__init__.

Это будет работать для вас:

class AssertionError(Exception): 
    def __init__(self, msg): 
     self.message = msg + " SOME TEXT" 
     super().__init__(self, self.message) 
assert 1 == 2, "FAIL" 

Если вы хотите, чтобы просмотреть сообщение в будущем, вы можете использовать Try/за исключением и поймать пользовательское сообщение, как это:

try: 
    assert 1 == 2, "FAIL" 
except AssertionError as e: 
    print(e.message) 
3

Это похоже на Morgan's answer, но использует немного другой способ достичь того же результата:

>>> class AssertionError(AssertionError): 
    def __init__(self, msg): 
     super().__init__(msg + ' SOME TEXT') 

>>> assert 1 == 2, 'FAIL' 
Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    assert 1 == 2, 'FAIL' 
AssertionError: FAIL SOME TEXT 
+0

Есть ли какая-либо реальная разница между подклассификацией 'Exception' и' AssertionError'? На самом деле я не уверен. Я бы предположил, что нет, потому что вы затеняете встроенный 'AssertionError', но я могу ошибаться. –

+0

Новый 'AssertionError' будет затенять версию в модуле' builtins' только в текущем пространстве имен. Если другой модуль использует 'buitins'' AssertionError', и поскольку 'AssertionError' наследует от исходного класса, другой модуль потенциально может по-прежнему поймать ошибку, если это произойдет. –

+0

Да, интересно. Я бы предположил, что он все равно бросит что-то, что другой модуль будет признан «AssertionError», но это хорошо знать. –

1

Этот вариант сохраняет исключение именно так, как он был поднят и изменяет его строковое представление только:

class AssertionError(AssertionError): 
    def __str__(self): 
     return super().__str__() + "SOME TEXT" 

(кредит: подклассов взяты из ответа NOCTIS')

Смежные вопросы