Improve error handling.

This commit is contained in:
Guido van Rossum 1991-12-16 15:44:24 +00:00
parent 6e93c07a06
commit 8832b62101
1 changed files with 30 additions and 5 deletions

View File

@ -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));