Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter@sugarlabs.org>2010-09-13 18:05:32 (GMT)
committer Walter Bender <walter@sugarlabs.org>2010-09-13 18:05:32 (GMT)
commit2f649e84c572a7c5db1417fddfd7bf596e8e640a (patch)
tree62e235775c24114a8907301dccd9165be943ffb6
parentdce78d7b0aa18d53314886fe0f15a67aefbd9d8e (diff)
#2313 -- better error messages from math errors
-rw-r--r--TurtleArt/taconstants.py3
-rw-r--r--TurtleArt/tajail.py24
-rw-r--r--TurtleArt/talogo.py51
-rw-r--r--TurtleArt/tawindow.py2
4 files changed, 48 insertions, 32 deletions
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)