mirror of https://github.com/python/cpython
Improve error handling.
This commit is contained in:
parent
6e93c07a06
commit
8832b62101
|
@ -35,6 +35,26 @@ extern int errno;
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#ifdef HUGE_VAL
|
||||||
|
#define CHECK(x) if (errno != 0) ; \
|
||||||
|
else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
|
||||||
|
else errno = ERANGE
|
||||||
|
#else
|
||||||
|
#define CHECK(x) /* Don't know how to check */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static object *
|
||||||
|
math_error()
|
||||||
|
{
|
||||||
|
if (errno == EDOM)
|
||||||
|
err_setstr(ValueError, "math domain error");
|
||||||
|
else if (errno == ERANGE)
|
||||||
|
err_setstr(OverflowError, "math range error");
|
||||||
|
else
|
||||||
|
err_errno(RuntimeError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
math_1(args, func)
|
math_1(args, func)
|
||||||
object *args;
|
object *args;
|
||||||
|
@ -45,8 +65,9 @@ math_1(args, func)
|
||||||
return NULL;
|
return NULL;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
x = (*func)(x);
|
x = (*func)(x);
|
||||||
|
CHECK(x);
|
||||||
if (errno != 0)
|
if (errno != 0)
|
||||||
return err_errno(RuntimeError);
|
return math_error();
|
||||||
else
|
else
|
||||||
return newfloatobject(x);
|
return newfloatobject(x);
|
||||||
}
|
}
|
||||||
|
@ -61,8 +82,9 @@ math_2(args, func)
|
||||||
return NULL;
|
return NULL;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
x = (*func)(x, y);
|
x = (*func)(x, y);
|
||||||
|
CHECK(x);
|
||||||
if (errno != 0)
|
if (errno != 0)
|
||||||
return err_errno(RuntimeError);
|
return math_error();
|
||||||
else
|
else
|
||||||
return newfloatobject(x);
|
return newfloatobject(x);
|
||||||
}
|
}
|
||||||
|
@ -120,8 +142,9 @@ math_frexp(self, args)
|
||||||
return NULL;
|
return NULL;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
x = frexp(x, &i);
|
x = frexp(x, &i);
|
||||||
|
CHECK(x);
|
||||||
if (errno != 0)
|
if (errno != 0)
|
||||||
return err_errno(RuntimeError);
|
return math_error();
|
||||||
v = newtupleobject(2);
|
v = newtupleobject(2);
|
||||||
if (v != NULL) {
|
if (v != NULL) {
|
||||||
settupleitem(v, 0, newfloatobject(x));
|
settupleitem(v, 0, newfloatobject(x));
|
||||||
|
@ -145,8 +168,9 @@ math_ldexp(self, args)
|
||||||
return NULL;
|
return NULL;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
x = ldexp(x, (int)y);
|
x = ldexp(x, (int)y);
|
||||||
|
CHECK(x);
|
||||||
if (errno != 0)
|
if (errno != 0)
|
||||||
return err_errno(RuntimeError);
|
return math_error();
|
||||||
else
|
else
|
||||||
return newfloatobject(x);
|
return newfloatobject(x);
|
||||||
}
|
}
|
||||||
|
@ -162,8 +186,9 @@ math_modf(self, args)
|
||||||
return NULL;
|
return NULL;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
x = modf(x, &y);
|
x = modf(x, &y);
|
||||||
|
CHECK(x);
|
||||||
if (errno != 0)
|
if (errno != 0)
|
||||||
return err_errno(RuntimeError);
|
return math_error();
|
||||||
v = newtupleobject(2);
|
v = newtupleobject(2);
|
||||||
if (v != NULL) {
|
if (v != NULL) {
|
||||||
settupleitem(v, 0, newfloatobject(x));
|
settupleitem(v, 0, newfloatobject(x));
|
||||||
|
|
Loading…
Reference in New Issue