Fix an edge case where ExceptionInfo._stringify_exception could crash pytest.raises (#11879)
Co-authored-by: Bruno Oliveira <bruno@soliv.dev> Co-authored-by: Zac Hatfield-Dodds <zac.hatfield.dodds@gmail.com>
This commit is contained in:
parent
21bec6cfbe
commit
407d984142
1
AUTHORS
1
AUTHORS
|
@ -93,6 +93,7 @@ Christopher Dignam
|
||||||
Christopher Gilling
|
Christopher Gilling
|
||||||
Claire Cecil
|
Claire Cecil
|
||||||
Claudio Madotto
|
Claudio Madotto
|
||||||
|
Clément M.T. Robert
|
||||||
CrazyMerlyn
|
CrazyMerlyn
|
||||||
Cristian Vera
|
Cristian Vera
|
||||||
Cyrus Maden
|
Cyrus Maden
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix an edge case where ``ExceptionInfo._stringify_exception`` could crash :func:`pytest.raises`.
|
|
@ -699,10 +699,21 @@ class ExceptionInfo(Generic[E]):
|
||||||
return fmt.repr_excinfo(self)
|
return fmt.repr_excinfo(self)
|
||||||
|
|
||||||
def _stringify_exception(self, exc: BaseException) -> str:
|
def _stringify_exception(self, exc: BaseException) -> str:
|
||||||
|
try:
|
||||||
|
notes = getattr(exc, "__notes__", [])
|
||||||
|
except KeyError:
|
||||||
|
# Workaround for https://github.com/python/cpython/issues/98778 on
|
||||||
|
# Python <= 3.9, and some 3.10 and 3.11 patch versions.
|
||||||
|
HTTPError = getattr(sys.modules.get("urllib.error", None), "HTTPError", ())
|
||||||
|
if sys.version_info[:2] <= (3, 11) and isinstance(exc, HTTPError):
|
||||||
|
notes = []
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
return "\n".join(
|
return "\n".join(
|
||||||
[
|
[
|
||||||
str(exc),
|
str(exc),
|
||||||
*getattr(exc, "__notes__", []),
|
*notes,
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -302,3 +302,16 @@ class TestRaises:
|
||||||
with pytest.raises(("hello", NotAnException)): # type: ignore[arg-type]
|
with pytest.raises(("hello", NotAnException)): # type: ignore[arg-type]
|
||||||
pass # pragma: no cover
|
pass # pragma: no cover
|
||||||
assert "must be a BaseException type, not str" in str(excinfo.value)
|
assert "must be a BaseException type, not str" in str(excinfo.value)
|
||||||
|
|
||||||
|
def test_issue_11872(self) -> None:
|
||||||
|
"""Regression test for #11872.
|
||||||
|
|
||||||
|
urllib.error.HTTPError on Python<=3.9 raises KeyError instead of
|
||||||
|
AttributeError on invalid attribute access.
|
||||||
|
|
||||||
|
https://github.com/python/cpython/issues/98778
|
||||||
|
"""
|
||||||
|
from urllib.error import HTTPError
|
||||||
|
|
||||||
|
with pytest.raises(HTTPError, match="Not Found"):
|
||||||
|
raise HTTPError(code=404, msg="Not Found", fp=None, hdrs=None, url="") # type: ignore [arg-type]
|
||||||
|
|
Loading…
Reference in New Issue