We check exception attributes to make sure errors happen as expected and carry the right information.
When you want to confirm a function raises an error with a specific message.
When testing that an error has a certain code or property.
When verifying that your program handles wrong inputs correctly by raising exceptions.
When you want to catch and inspect details of an error during automated tests.
Syntax
PyTest
with pytest.raises(ExpectedException) as exc_info:
# code that raises the exception# access exception attributesassert exc_info.value.attribute == expected_value
Use exc_info.value to get the actual exception object.
You can check any attribute of the exception like message, code, or custom properties.
Examples
This checks that converting 'abc' to int raises a ValueError with a message containing 'invalid literal'.
PyTest
with pytest.raises(ValueError) as exc_info:
int('abc')
assert'invalid literal'instr(exc_info.value)
This tests a custom exception and checks its code attribute.
PyTest
class MyError(Exception):
def __init__(self, code):
self.code = code
with pytest.raises(MyError) as exc_info:
raise MyError(404)
assert exc_info.value.code == 404
Sample Program
This test checks that func() raises CustomError with message 'Not found' and code 404.
Always check the exact attribute you want to verify on the exception object.
Using exc_info helps you avoid catching exceptions outside the test scope.
Summary
Use pytest.raises with as exc_info to capture exceptions.
Check exception attributes via exc_info.value.
This helps confirm your code raises correct errors with expected details.
Practice
(1/5)
1. What is the correct way to capture an exception and check its message using pytest.raises?
easy
A. Use pytest.raises(ValueError) as exc_info: outside a with block.
B. Use pytest.raises(ValueError) without as exc_info and check exc_info.message.
C. Use with pytest.raises() as exc_info: and check exc_info.error.
D. Use with pytest.raises(ValueError) as exc_info: and then check exc_info.value.
Solution
Step 1: Use pytest.raises with as exc_info
This syntax captures the exception info object for inspection.
Step 2: Access the exception instance via exc_info.value
The actual exception object is stored in exc_info.value, allowing attribute checks like the message.
Final Answer:
Use with pytest.raises(ValueError) as exc_info: and then check exc_info.value. -> Option D
Quick Check:
Exception captured = exc_info.value [OK]
Hint: Always use 'as exc_info' to access exception details [OK]
Common Mistakes:
Not using 'as exc_info' to capture exception
Trying to access exc_info.message instead of exc_info.value
Using pytest.raises outside a with block
2. Which of the following is the correct syntax to check the exception message text inside a pytest test?
easy
A. assert exc_info.message == 'error occurred'
B. assert exc_info.value.message == 'error occurred'
C. assert str(exc_info.value) == 'error occurred'
D. assert exc_info.error == 'error occurred'
Solution
Step 1: Access exception instance via exc_info.value
The exception object is stored in exc_info.value.
Step 2: Convert exception to string to get message
Using str(exc_info.value) returns the exception message text.
Final Answer:
assert str(exc_info.value) == 'error occurred' -> Option C
Quick Check:
Exception message = str(exc_info.value) [OK]
Hint: Use str(exc_info.value) to get exception message text [OK]
Common Mistakes:
Trying to access exc_info.message which does not exist
Using exc_info.error which is invalid
Assuming exc_info.value.message always exists
3. Given the code below, what will the assertion check inside the test?
def divide(x, y):
if y == 0:
raise ZeroDivisionError('Cannot divide by zero')
return x / y
def test_divide():
with pytest.raises(ZeroDivisionError) as exc_info:
divide(5, 0)
assert str(exc_info.value) == 'Cannot divide by zero'
medium
A. The test raises an error because exc_info is not defined.
B. The test passes because the exception message matches exactly.
C. The test fails because the exception message is different.
D. The test fails because the exception type is wrong.
Solution
Step 1: The function raises ZeroDivisionError with correct message
Calling divide(5, 0) raises ZeroDivisionError with message 'Cannot divide by zero'.
Step 2: The test captures exception and asserts message
Using pytest.raises captures the exception, and str(exc_info.value) matches the expected message.
Final Answer:
The test passes because the exception message matches exactly. -> Option B
Quick Check:
Exception type and message match = pass [OK]
Hint: Match exception message string exactly with str(exc_info.value) [OK]
Common Mistakes:
Assuming exception message is accessed by exc_info.message
Not using 'as exc_info' to capture exception
Confusing exception type with message
4. Identify the error in the following pytest test code that checks exception attributes:
def test_error():
with pytest.raises(ValueError) as exc_info:
raise ValueError('Invalid input')
assert exc_info.message == 'Invalid input'
medium
A. Using exc_info.message instead of str(exc_info.value) to check message.
B. Not raising the exception inside the with block.
C. Missing parentheses in pytest.raises call.
D. Using as exc_info outside the with block.
Solution
Step 1: Check how exception message is accessed
The exception message is not stored in exc_info.message, but must be accessed via str(exc_info.value).
Using exc_info.message instead of str(exc_info.value) to check message. -> Option A
Quick Check:
Exception message accessed via str(exc_info.value) [OK]
Hint: Use str(exc_info.value) to get exception message, not exc_info.message [OK]
Common Mistakes:
Trying to access exc_info.message which does not exist
Not raising exception inside with block
Incorrect pytest.raises syntax
5. You want to test a custom exception MyError that has an attribute code. Which pytest code correctly checks both the exception type and the code attribute value?
hard
A. with pytest.raises(MyError) as exc_info:
raise MyError('fail', code=404)
assert exc_info.value.code == 404
B. with pytest.raises(MyError) as exc_info:
raise MyError('fail', code=404)
assert exc_info.code == 404
C. with pytest.raises(MyError):
raise MyError('fail', code=404)
assert exc_info.value.code == 404
D. with pytest.raises(MyError) as exc_info:
raise MyError('fail', code=404)
assert str(exc_info.value) == 404
Solution
Step 1: Capture exception with as exc_info
This allows access to the exception instance and its attributes.
Step 2: Access custom attribute code on exc_info.value
The exception instance is exc_info.value, so exc_info.value.code accesses the attribute.
Final Answer:
with pytest.raises(MyError) as exc_info:
raise MyError('fail', code=404)
assert exc_info.value.code == 404 -> Option A
Quick Check:
Custom attribute checked via exc_info.value.code [OK]
Hint: Check custom attributes on exc_info.value, not exc_info directly [OK]
Common Mistakes:
Trying to access exc_info.code instead of exc_info.value.code
Not using 'as exc_info' to capture exception
Comparing str(exc_info.value) to a number
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.