How to change the message in a Python AssertionError?
PythonExceptionAssertionsNosePython 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.