From 8832b621015c91fcca6799f633aa3f239d6189c1 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 16 Dec 1991 15:44:24 +0000 Subject: Improve error handling. --- Modules/mathmodule.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 751f02b..fdc576d 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -35,6 +35,26 @@ extern int errno; #include +#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 * math_1(args, func) object *args; @@ -45,8 +65,9 @@ math_1(args, func) return NULL; errno = 0; x = (*func)(x); + CHECK(x); if (errno != 0) - return err_errno(RuntimeError); + return math_error(); else return newfloatobject(x); } @@ -61,8 +82,9 @@ math_2(args, func) return NULL; errno = 0; x = (*func)(x, y); + CHECK(x); if (errno != 0) - return err_errno(RuntimeError); + return math_error(); else return newfloatobject(x); } @@ -120,8 +142,9 @@ math_frexp(self, args) return NULL; errno = 0; x = frexp(x, &i); + CHECK(x); if (errno != 0) - return err_errno(RuntimeError); + return math_error(); v = newtupleobject(2); if (v != NULL) { settupleitem(v, 0, newfloatobject(x)); @@ -145,8 +168,9 @@ math_ldexp(self, args) return NULL; errno = 0; x = ldexp(x, (int)y); + CHECK(x); if (errno != 0) - return err_errno(RuntimeError); + return math_error(); else return newfloatobject(x); } @@ -162,8 +186,9 @@ math_modf(self, args) return NULL; errno = 0; x = modf(x, &y); + CHECK(x); if (errno != 0) - return err_errno(RuntimeError); + return math_error(); v = newtupleobject(2); if (v != NULL) { settupleitem(v, 0, newfloatobject(x)); -- cgit v0.12