From 2f649e84c572a7c5db1417fddfd7bf596e8e640a Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Mon, 13 Sep 2010 18:05:32 +0000 Subject: #2313 -- better error messages from math errors --- diff --git a/TurtleArt/taconstants.py b/TurtleArt/taconstants.py index 355f9bf..684b5e6 100644 --- a/TurtleArt/taconstants.py +++ b/TurtleArt/taconstants.py @@ -643,7 +643,8 @@ OVERLAY_SHAPES = ['Cartesian', 'Cartesian_labeled', 'polar'] STATUS_SHAPES = ['status', 'info', 'nostack', 'noinput', 'emptyheap', 'emptybox', 'nomedia', 'nocode', 'overflowerror', 'negroot', - 'syntaxerror', 'nofile', 'nojournal', 'zerodivide'] + 'syntaxerror', 'nofile', 'nojournal', 'zerodivide', + 'notanumber'] # # Emulate Sugar toolbar when running from outside of Sugar diff --git a/TurtleArt/tajail.py b/TurtleArt/tajail.py index 091557b..8962674 100644 --- a/TurtleArt/tajail.py +++ b/TurtleArt/tajail.py @@ -34,30 +34,18 @@ def myfunc(f, args): if len(args) == 1: myf = "def f(x): return " + f.replace("import","") userdefined = {} - try: - exec myf in globals(), userdefined - return userdefined.values()[0](args[0]) - except: - traceback.print_exc() - return None + exec myf in globals(), userdefined + return userdefined.values()[0](args[0]) elif len(args) == 2: myf = "def f(x,y): return " + f.replace("import","") userdefined = {} - try: - exec myf in globals(), userdefined - return userdefined.values()[0](args[0],args[1]) - except: - traceback.print_exc() - return None + exec myf in globals(), userdefined + return userdefined.values()[0](args[0],args[1]) elif len(args) == 3: myf = "def f(x,y,z): return " + f.replace("import","") userdefined = {} - try: - exec myf in globals(), userdefined - return userdefined.values()[0](args[0],args[1],args[2]) - except: - traceback.print_exc() - return None + exec myf in globals(), userdefined + return userdefined.values()[0](args[0],args[1],args[2]) def myfunc_import(lc, f, x): userdefined = {} diff --git a/TurtleArt/talogo.py b/TurtleArt/talogo.py index 0ce1712..14a698c 100644 --- a/TurtleArt/talogo.py +++ b/TurtleArt/talogo.py @@ -27,6 +27,7 @@ from math import sqrt from random import uniform from operator import isNumberType from UserDict import UserDict + try: from sugar.datastore import datastore except: @@ -40,6 +41,10 @@ from tautils import get_pixbuf_from_journal, movie_media_type, convert, \ strtype from gettext import gettext as _ +import logging +_logger = logging.getLogger('turtleart-activity') + + class noKeyError(UserDict): __missing__ = lambda x, y: 0 @@ -105,6 +110,8 @@ def careful_divide(x, y): raise logoerror("#zerodivide") except ValueError: raise logoerror("#syntaxerror") + except TypeError: + raise logoerror("#notanumber") def taequal(x, y): """ Numeric and logical equal """ @@ -138,7 +145,7 @@ def taless(x, y): try: return str_to_num(x) < str_to_num(y) except TypeError: - raise logoerror("#syntaxerror") + raise logoerror("#notanumber") def tamore(x, y): """ Compare numbers and strings """ @@ -166,7 +173,7 @@ def taminus(x, y): try: return str_to_num(x) - str_to_num(y) except TypeError: - raise logoerror("#syntaxerror") + raise logoerror("#notanumber") def taproduct(x, y): """ Numerical multiplication """ @@ -175,7 +182,7 @@ def taproduct(x, y): try: return str_to_num(x) * str_to_num(y) except TypeError: - raise logoerror("#syntaxerror") + raise logoerror("#notanumber") def tamod(x, y): """ Numerical mod """ @@ -184,7 +191,7 @@ def tamod(x, y): try: return str_to_num(x) % str_to_num(y) except TypeError: - raise logoerror("#syntaxerror") + raise logoerror("#notanumber") except ValueError: raise logoerror("#syntaxerror") @@ -199,7 +206,7 @@ def tasqrt(x): except ValueError: raise logoerror("#negroot") except TypeError: - raise logoerror("#syntaxerror") + raise logoerror("#notanumber") def tarandom(x, y): """ Random integer """ @@ -217,7 +224,7 @@ def tarandom(x, y): try: return(int(uniform(xx, yy))) except TypeError: - raise logoerror("#syntaxerror") + raise logoerror("#notanumber") def identity(x): """ Identity function """ @@ -826,12 +833,34 @@ class LogoCode: def myfunction(self, f, x): """ Programmable block """ - y = myfunc(f, x) - if y == None: + try: + y = myfunc(f, x) + if str(y) == 'nan': + _logger.debug("python function returned nan") + stop_logo(self.tw) + raise logoerror("#notanumber") + else: + return y + except ZeroDivisionError: + _logger.debug("ZeroDivisionError") + stop_logo(self.tw) + raise logoerror("#zerodivide") + except ValueError: + _logger.debug("ValueError") stop_logo(self.tw) raise logoerror("#syntaxerror") - else: - return y + except NameError: + _logger.debug("NameError") + stop_logo(self.tw) + raise logoerror("#syntaxerror") + except OverflowError: + _logger.debug("OverflowError") + stop_logo(self.tw) + raise logoerror("#overflowerror") + except TypeError: + _logger.debug("TypeError") + stop_logo(self.tw) + raise logoerror("#notanumber") def prim_forever(self, blklist): """ Do list forever """ @@ -956,7 +985,7 @@ class LogoCode: else: y = myfunc_import(self, self.tw.myblock, x) except: - raise logoerror("#nocode") + raise logoerror("#syntaxerror") else: raise logoerror("#nocode") return diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py index 14619f7..2a8732f 100644 --- a/TurtleArt/tawindow.py +++ b/TurtleArt/tawindow.py @@ -2188,8 +2188,6 @@ class TurtleArtWindow(): elif shp[0] == '#': shp = shp[1:] label = '' - if shp == 'notanumber': - shp = 'overflowerror' self.status_spr.set_shape(self.status_shapes[shp]) self.status_spr.set_label(str(label)) self.status_spr.set_layer(STATUS_LAYER) -- cgit v0.9.1