Commit 6b3f3f28 authored by Fred Drake's avatar Fred Drake

In the first discussion showing how to handle exceptions from C, make the

Python equivalent actually equivalent to the C code.  Also, in the C code,
place the "goto" statements on a line by themselves for better visibility
of statements that affect control flow.

This closes bug #123398.
parent 15ffc71c
...@@ -456,7 +456,7 @@ def incr_item(dict, key): ...@@ -456,7 +456,7 @@ def incr_item(dict, key):
item = dict[key] item = dict[key]
except KeyError: except KeyError:
item = 0 item = 0
return item + 1 dict[key] = item + 1
\end{verbatim} \end{verbatim}
\ttindex{incr_item()} \ttindex{incr_item()}
...@@ -472,21 +472,25 @@ int incr_item(PyObject *dict, PyObject *key) ...@@ -472,21 +472,25 @@ int incr_item(PyObject *dict, PyObject *key)
item = PyObject_GetItem(dict, key); item = PyObject_GetItem(dict, key);
if (item == NULL) { if (item == NULL) {
/* Handle KeyError only: */ /* Handle KeyError only: */
if (!PyErr_ExceptionMatches(PyExc_KeyError)) goto error; if (!PyErr_ExceptionMatches(PyExc_KeyError))
goto error;
/* Clear the error and use zero: */ /* Clear the error and use zero: */
PyErr_Clear(); PyErr_Clear();
item = PyInt_FromLong(0L); item = PyInt_FromLong(0L);
if (item == NULL) goto error; if (item == NULL)
goto error;
} }
const_one = PyInt_FromLong(1L); const_one = PyInt_FromLong(1L);
if (const_one == NULL) goto error; if (const_one == NULL)
goto error;
incremented_item = PyNumber_Add(item, const_one); incremented_item = PyNumber_Add(item, const_one);
if (incremented_item == NULL) goto error; if (incremented_item == NULL)
goto error;
if (PyObject_SetItem(dict, key, incremented_item) < 0) goto error; if (PyObject_SetItem(dict, key, incremented_item) < 0)
goto error;
rv = 0; /* Success */ rv = 0; /* Success */
/* Continue with cleanup code */ /* Continue with cleanup code */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment