https://github.com/python/cpython/commit/1d4c2e4a877a48cdc8bcc9808d799b91c82b3757
commit: 1d4c2e4a877a48cdc8bcc9808d799b91c82b3757
branch: main
author: Nikita Sobolev <[email protected]>
committer: sobolevn <[email protected]>
date: 2024-06-03T19:03:56+03:00
summary:
gh-119057: Use better error messages for zero division (#119066)
files:
A Misc/NEWS.d/next/Core and
Builtins/2024-05-15-12-15-58.gh-issue-119057.P3G9G2.rst
M Doc/howto/logging-cookbook.rst
M Lib/_pylong.py
M Lib/test/mathdata/ieee754.txt
M Lib/test/test_builtin.py
M Lib/test/test_doctest/test_doctest.py
M Lib/test/test_generators.py
M Lib/test/test_genexps.py
M Objects/complexobject.c
M Objects/floatobject.c
M Objects/longobject.c
diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst
index 60d88204b795f6..3ed2dd6251afe9 100644
--- a/Doc/howto/logging-cookbook.rst
+++ b/Doc/howto/logging-cookbook.rst
@@ -2950,7 +2950,7 @@ When run, this produces a file with exactly two lines:
.. code-block:: none
28/01/2015 07:21:23|INFO|Sample message|
- 28/01/2015 07:21:23|ERROR|ZeroDivisionError: integer division or modulo by
zero|'Traceback (most recent call last):\n File "logtest7.py", line 30, in
main\n x = 1 / 0\nZeroDivisionError: integer division or modulo by zero'|
+ 28/01/2015 07:21:23|ERROR|ZeroDivisionError: division by zero|'Traceback
(most recent call last):\n File "logtest7.py", line 30, in main\n x = 1 /
0\nZeroDivisionError: division by zero'|
While the above treatment is simplistic, it points the way to how exception
information can be formatted to your liking. The :mod:`traceback` module may be
diff --git a/Lib/_pylong.py b/Lib/_pylong.py
index f7aabde1434725..a8bf5cd3e638a4 100644
--- a/Lib/_pylong.py
+++ b/Lib/_pylong.py
@@ -530,7 +530,7 @@ def int_divmod(a, b):
Its time complexity is O(n**1.58), where n = #bits(a) + #bits(b).
"""
if b == 0:
- raise ZeroDivisionError
+ raise ZeroDivisionError('division by zero')
elif b < 0:
q, r = int_divmod(-a, -b)
return q, -r
diff --git a/Lib/test/mathdata/ieee754.txt b/Lib/test/mathdata/ieee754.txt
index a8b8a0a2148f00..0bc45603b8b18a 100644
--- a/Lib/test/mathdata/ieee754.txt
+++ b/Lib/test/mathdata/ieee754.txt
@@ -116,7 +116,7 @@ inf
>>> 0 ** -1
Traceback (most recent call last):
...
-ZeroDivisionError: 0.0 cannot be raised to a negative power
+ZeroDivisionError: zero to a negative power
>>> pow(0, NAN)
nan
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index d7ba58847a2992..9ff0f488dc4fa9 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -662,6 +662,16 @@ def test_divmod(self):
self.assertAlmostEqual(result[1], exp_result[1])
self.assertRaises(TypeError, divmod)
+ self.assertRaisesRegex(
+ ZeroDivisionError,
+ "division by zero",
+ divmod, 1, 0,
+ )
+ self.assertRaisesRegex(
+ ZeroDivisionError,
+ "division by zero",
+ divmod, 0.0, 0,
+ )
def test_eval(self):
self.assertEqual(eval('1+1'), 2)
diff --git a/Lib/test/test_doctest/test_doctest.py
b/Lib/test/test_doctest/test_doctest.py
index 286c3ecfbc9239..b25d57ceeae6aa 100644
--- a/Lib/test/test_doctest/test_doctest.py
+++ b/Lib/test/test_doctest/test_doctest.py
@@ -1035,7 +1035,7 @@ def exceptions(): r"""
... >>> x = 12
... >>> print(x//0)
... Traceback (most recent call last):
- ... ZeroDivisionError: integer division or modulo by zero
+ ... ZeroDivisionError: division by zero
... '''
>>> test = doctest.DocTestFinder().find(f)[0]
>>> doctest.DocTestRunner(verbose=False).run(test)
@@ -1052,7 +1052,7 @@ def exceptions(): r"""
... >>> print('pre-exception output', x//0)
... pre-exception output
... Traceback (most recent call last):
- ... ZeroDivisionError: integer division or modulo by zero
+ ... ZeroDivisionError: division by zero
... '''
>>> test = doctest.DocTestFinder().find(f)[0]
>>> doctest.DocTestRunner(verbose=False).run(test)
@@ -1063,7 +1063,7 @@ def exceptions(): r"""
print('pre-exception output', x//0)
Exception raised:
...
- ZeroDivisionError: integer division or modulo by zero
+ ZeroDivisionError: division by zero
TestResults(failed=1, attempted=2)
Exception messages may contain newlines:
@@ -1258,7 +1258,7 @@ def exceptions(): r"""
Exception raised:
Traceback (most recent call last):
...
- ZeroDivisionError: integer division or modulo by zero
+ ZeroDivisionError: division by zero
TestResults(failed=1, attempted=1)
>>> _colorize.COLORIZE = save_colorize
diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py
index 6d36df2c7413e0..4598e62122b09c 100644
--- a/Lib/test/test_generators.py
+++ b/Lib/test/test_generators.py
@@ -907,7 +907,7 @@ def b():
File "<stdin>", line 1, in ?
File "<stdin>", line 2, in g
File "<stdin>", line 2, in f
- ZeroDivisionError: integer division or modulo by zero
+ ZeroDivisionError: division by zero
>>> next(k) # and the generator cannot be resumed
Traceback (most recent call last):
File "<stdin>", line 1, in ?
diff --git a/Lib/test/test_genexps.py b/Lib/test/test_genexps.py
index 4f2d3cdcc7943e..7fb58a67368576 100644
--- a/Lib/test/test_genexps.py
+++ b/Lib/test/test_genexps.py
@@ -223,7 +223,7 @@
next(g)
File "<pyshell#35>", line 1, in <generator expression>
g = (10 // i for i in (5, 0, 2))
- ZeroDivisionError: integer division or modulo by zero
+ ZeroDivisionError: division by zero
>>> next(g)
Traceback (most recent call last):
File "<pyshell#38>", line 1, in -toplevel-
diff --git a/Misc/NEWS.d/next/Core and
Builtins/2024-05-15-12-15-58.gh-issue-119057.P3G9G2.rst b/Misc/NEWS.d/next/Core
and Builtins/2024-05-15-12-15-58.gh-issue-119057.P3G9G2.rst
new file mode 100644
index 00000000000000..d252888906c348
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and
Builtins/2024-05-15-12-15-58.gh-issue-119057.P3G9G2.rst
@@ -0,0 +1,4 @@
+Improve :exc:`ZeroDivisionError` error message.
+Now, all error messages are harmonized: all ``/``, ``//``, and ``%``
+operations just use "division by zero" message.
+And ``0 ** -1`` operation uses "zero to a negative power".
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index 59c84f1359b966..a8be266970afd0 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -523,7 +523,7 @@ complex_div(PyObject *v, PyObject *w)
errno = 0;
quot = _Py_c_quot(a, b);
if (errno == EDOM) {
- PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero");
+ PyErr_SetString(PyExc_ZeroDivisionError, "division by zero");
return NULL;
}
return PyComplex_FromCComplex(quot);
@@ -554,7 +554,7 @@ complex_pow(PyObject *v, PyObject *w, PyObject *z)
_Py_ADJUST_ERANGE2(p.real, p.imag);
if (errno == EDOM) {
PyErr_SetString(PyExc_ZeroDivisionError,
- "0.0 to a negative or complex power");
+ "zero to a negative or complex power");
return NULL;
}
else if (errno == ERANGE) {
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index a5bf356cc9c7f0..2627ba80eed8ca 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -623,7 +623,7 @@ float_div(PyObject *v, PyObject *w)
CONVERT_TO_DOUBLE(w, b);
if (b == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError,
- "float division by zero");
+ "division by zero");
return NULL;
}
a = a / b;
@@ -639,7 +639,7 @@ float_rem(PyObject *v, PyObject *w)
CONVERT_TO_DOUBLE(w, wx);
if (wx == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError,
- "float modulo by zero");
+ "division by zero");
return NULL;
}
mod = fmod(vx, wx);
@@ -704,7 +704,7 @@ float_divmod(PyObject *v, PyObject *w)
CONVERT_TO_DOUBLE(v, vx);
CONVERT_TO_DOUBLE(w, wx);
if (wx == 0.0) {
- PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
+ PyErr_SetString(PyExc_ZeroDivisionError, "division by zero");
return NULL;
}
_float_div_mod(vx, wx, &floordiv, &mod);
@@ -719,7 +719,7 @@ float_floor_div(PyObject *v, PyObject *w)
CONVERT_TO_DOUBLE(v, vx);
CONVERT_TO_DOUBLE(w, wx);
if (wx == 0.0) {
- PyErr_SetString(PyExc_ZeroDivisionError, "float floor division by
zero");
+ PyErr_SetString(PyExc_ZeroDivisionError, "division by zero");
return NULL;
}
_float_div_mod(vx, wx, &floordiv, &mod);
@@ -788,8 +788,7 @@ float_pow(PyObject *v, PyObject *w, PyObject *z)
int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw);
if (iw < 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError,
- "0.0 cannot be raised to a "
- "negative power");
+ "zero to a negative power");
return NULL;
}
/* use correct sign if iw is odd */
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 054689471e7aa9..ee0b2a038a2aab 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -3121,8 +3121,7 @@ long_divrem(PyLongObject *a, PyLongObject *b,
PyLongObject *z;
if (size_b == 0) {
- PyErr_SetString(PyExc_ZeroDivisionError,
- "integer division or modulo by zero");
+ PyErr_SetString(PyExc_ZeroDivisionError, "division by zero");
return -1;
}
if (size_a < size_b ||
@@ -3185,7 +3184,7 @@ long_rem(PyLongObject *a, PyLongObject *b, PyLongObject
**prem)
if (size_b == 0) {
PyErr_SetString(PyExc_ZeroDivisionError,
- "integer modulo by zero");
+ "division by zero");
return -1;
}
if (size_a < size_b ||
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]