Unfortunately this logic is still convoluted and even wrong... we need to do the `PyErr_Occurred` check regardless of the state of the fp err flags and errormask.

The logic should be
```
if (PyErr_Occurred() || _check_ufunc_err(errormask, extobj, ufunc_name, first_error)) {
   ... fail ...
}
```
and then `_check_fp_err` should do
```
if (!errormask) {
   return okay
}
fperr = PyUFunc_getfperr();
if (!fperr) {
    return okay
}
/* current body of PyUFunc_handlefperr goes here, except that _error_handler is switched to take
   extobj and ufunc_name as separate arguments */
```
and `_error_handler` is modified as per above, and `PyUFunc_handlefperr` -- which is now unused, but has to be kept for API compatibility -- just becomes
```
extract extobj and ufunc_name from errobj
call _check_ufunc_err
```