How to change the message in a Python AssertionError?

PythonExceptionAssertionsNose

Python Problem Overview


I'm writing per the following, in which I try to produce a decent error message when comparing two multiline blocks of Unicode text. The interior method that does the comparison raises an assertion, but the default explanation is useless to me

I need to add something to code such as this below:

def assert_long_strings_equal(one, other):
    lines_one = one.splitlines()
    lines_other = other.splitlines()
    for line1, line2 in zip(lines_one, lines_other):
        try:
            my_assert_equal(line1, line2)
        except AssertionError, error:
            # Add some information to the printed result of error??!
            raise

I cannot figure out how to change the printed error message in the assertionerror I catch. I always get AssertionError: u'something' != 'something else', which only shows the first line of the output.

How can I change the assertion message to print out whatever I want?

If it's relevant, I am using nose to run the test.

Python Solutions


Solution 1 - Python

assert expression, info

For instance,

>>> assert False, "Oopsie"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Oopsie

From the docs:

> Assert statements are a convenient way > to insert debugging assertions into a > program: > > assert_stmt ::= "assert" expression > ["," expression] > > The simple form, > assert expression, is equivalent to > > if debug: > if not expression: > raise AssertionError

> The extended form > > assert expression1, expression2 > > is equivalent to > > if debug: > if not expression1: > raise AssertionError(expression2) > > These equivalences assume that > __debug__ and AssertionError refer to the built-in variables with those > names. In the current implementation, > the built-in variable __debug__ is > True under normal circumstances, False > when optimization is requested > (command line option -O). The current > code generator emits no code for an > assert statement when optimization is > requested at compile time. Note that > it is unnecessary to include the > source code for the expression that > failed in the error message; it will > be displayed as part of the stack > trace.

Solution 2 - Python

Use e.args, e.message is deprecated.

try:
    assert False, "Hello!"
except AssertionError as e:
    e.args += ('some other', 'important', 'information', 42)
    raise

This preserves the original traceback. Its last part then looks like this:

AssertionError: ('Hello!', 'some other', 'important', 'information', 42)

Works in both Python 2.7 and Python 3.

Solution 3 - Python

You want to take the caught exception, convert it to a string, combine it with some additional string info, and raise a new exception.

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )

Solution 4 - Python

You can pass the desired message when creating the exception.

raise AssertionError(line1 + ' != ' + line2)

Hope this helps.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndres Jaan TackView Question on Stackoverflow
Solution 1 - PythonKatrielView Answer on Stackoverflow
Solution 2 - PythonHonza JavorekView Answer on Stackoverflow
Solution 3 - PythonRussell BorogoveView Answer on Stackoverflow
Solution 4 - PythonzchtoddView Answer on Stackoverflow