err_msg = "b'please do not show me as numbers'"
self.assertEqual(self.get_report(e), vanilla + err_msg + '\n')
- def test_exception_with_note_with_multiple_notes(self):
- e = ValueError(42)
- vanilla = self.get_report(e)
-
- e.add_note('Note 1')
- e.add_note('Note 2')
- e.add_note('Note 3')
-
- self.assertEqual(
- self.get_report(e),
- vanilla + 'Note 1\n' + 'Note 2\n' + 'Note 3\n')
-
- del e.__notes__
- e.add_note('Note 4')
- del e.__notes__
- e.add_note('Note 5')
- e.add_note('Note 6')
-
- self.assertEqual(
- self.get_report(e),
- vanilla + 'Note 5\n' + 'Note 6\n')
+ def test_exception_with_multiple_notes(self):
+ for e in [ValueError(42), SyntaxError('bad syntax')]:
+ with self.subTest(e=e):
+ vanilla = self.get_report(e)
+
+ e.add_note('Note 1')
+ e.add_note('Note 2')
+ e.add_note('Note 3')
+
+ self.assertEqual(
+ self.get_report(e),
+ vanilla + 'Note 1\n' + 'Note 2\n' + 'Note 3\n')
+
+ del e.__notes__
+ e.add_note('Note 4')
+ del e.__notes__
+ e.add_note('Note 5')
+ e.add_note('Note 6')
+
+ self.assertEqual(
+ self.get_report(e),
+ vanilla + 'Note 5\n' + 'Note 6\n')
def test_exception_qualname(self):
class A:
}
static int
-print_exception_notes(struct exception_print_context *ctx, PyObject *value)
+print_exception_notes(struct exception_print_context *ctx, PyObject *notes)
{
PyObject *f = ctx->file;
- if (!PyExceptionInstance_Check(value)) {
+ if (notes == NULL) {
return 0;
}
- PyObject *notes;
- int res = PyObject_GetOptionalAttr(value, &_Py_ID(__notes__), ¬es);
- if (res <= 0) {
- return res;
- }
if (!PySequence_Check(notes) || PyUnicode_Check(notes) || PyBytes_Check(notes)) {
- res = 0;
+ int res = 0;
if (write_indented_margin(ctx, f) < 0) {
res = -1;
}
res = PyFile_WriteObject(s, f, Py_PRINT_RAW);
Py_DECREF(s);
}
- Py_DECREF(notes);
if (PyFile_WriteString("\n", f) < 0) {
res = -1;
}
}
}
- Py_DECREF(notes);
return 0;
error:
Py_XDECREF(lines);
- Py_DECREF(notes);
return -1;
}
static int
print_exception(struct exception_print_context *ctx, PyObject *value)
{
+ PyObject *notes = NULL;
PyObject *f = ctx->file;
if (!PyExceptionInstance_Check(value)) {
goto error;
}
- /* grab the type now because value can change below */
+ /* grab the type and notes now because value can change below */
PyObject *type = (PyObject *) Py_TYPE(value);
+ if (PyObject_GetOptionalAttr(value, &_Py_ID(__notes__), ¬es) < 0) {
+ goto error;
+ }
if (print_exception_file_and_line(ctx, &value) < 0) {
goto error;
if (PyFile_WriteString("\n", f) < 0) {
goto error;
}
- if (print_exception_notes(ctx, value) < 0) {
+ if (print_exception_notes(ctx, notes) < 0) {
goto error;
}
+ Py_XDECREF(notes);
Py_DECREF(value);
assert(!PyErr_Occurred());
return 0;
error:
+ Py_XDECREF(notes);
Py_DECREF(value);
return -1;
}