On Wednesday 22 July 2009 12:18:52 mdipierro wrote:
> Some of them have been fixed but some may still need fixes. Help will
> be appreciated.
Ok, here it is.
I went over all files in gluon/ and changed all raises that were providing 
uhelpful (IMHO of course) tracebacks.
Patch is against current trunk

> Massimo
>
> On Jul 22, 3:09 am, Alexey Nezhdanov <snak...@gmail.com> wrote:
> > On Friday 17 July 2009 19:11:11 JohnMc wrote:> BTW, this is perfect
> > example of helpless backtrace.
> >
> > > Consider how much better it would be if it look like this:
> > > ==============
> > > SyntaxError: invalid field name: 'tablename.fieldname'
> > >
> > > -- Alexey
> > >
> > > That might have helped some. But to tell you the truth I went field by
> > > field twice looking for just such an occurrence.
> >
> > EXACTLY! You were looking for an error looking _field_by_field_. Even if
> > you have just 50 of them - that's a lot of work. Instead of concentrating
> > on the SINGLE field.> My own mind filled in
> >
> > > the blank. That level of human error no amount of syntax checking will
> > > solve.
> >
> > I'm sure it can be helped. Human errors are well known and backtraces are
> > the perfect place to help fixing them.
> >
> > Anyways, Massimo - I didn't look into the code for a while already so I
> > do not know how the things are at the moment. Do you want me to go over
> > all 'raise' statements and submit a patch that will add more useful info
> > just like in this example?
> >
> > > Just sayin'.
> > >
> > > On Jul 17, 2:12 am, Alexey Nezhdanov <snak...@gmail.com> wrote:
> > > > BTW, this is perfect example of helpless backtrace.
> > > > Consider how much better it would be if it look like this:
> > > > ==============
> > > > SyntaxError: invalid field name: 'tablename.fieldname'
> > > > ==============
> > > >
> > > > I submitted couple of similar patches some time ago, do not know if
> > > > they were
> > > > included:http://groups.google.com/group/web2py/browse_thread/thread/8
> > > >568a 5ea58...
> > > >
> > > > --
> > > > Sincerely yours
> > > > Alexey Nezhdanov
> >
> > --
> > Sincerely yours
> > Alexey Nezhdanov
>
> 


-- 
Sincerely yours
Alexey Nezhdanov

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

=== modified file 'gluon/contrib/feedparser.py'
--- gluon/contrib/feedparser.py	2009-05-15 16:51:05 +0000
+++ gluon/contrib/feedparser.py	2009-07-23 06:45:03 +0000
@@ -3268,7 +3268,7 @@
                 if _debug:
                     sys.stderr.write('date handler function must return 9-tuple\n'
                             )
-                raise ValueError
+                raise ValueError('date handler function must return 9-tuple')
             map(int, date9tuple)
             return date9tuple
         except Exception, e:

=== modified file 'gluon/contrib/gql.py'
--- gluon/contrib/gql.py	2009-07-18 02:52:22 +0000
+++ gluon/contrib/gql.py	2009-07-23 06:49:18 +0000
@@ -193,7 +193,7 @@
             elif isinstance(field, SQLTable):
                 new_fields += [copy.copy(field[f]) for f in field.fields if f != 'id']
             else:
-                raise SyntaxError, 'define_table argument is not a SQLField'
+                raise SyntaxError, 'define_table argument \'%s\'is not a SQLField'%field
         fields = new_fields
         self._db = db
         self._tablename = tablename
@@ -594,7 +594,7 @@
     def __call__(self, where):
         if isinstance(self.where, QueryException) or isinstance(where,
                 QueryException):
-            raise SyntaxError
+            raise SyntaxError("Neither self.where nor where can't be a QueryException instance")
         if self.where:
             return SQLSet(self._db, self.where & where)
         else:

=== modified file 'gluon/contrib/memdb.py'
--- gluon/contrib/memdb.py	2009-07-18 02:52:22 +0000
+++ gluon/contrib/memdb.py	2009-07-23 07:35:42 +0000
@@ -50,7 +50,7 @@
 def cleanup(text):
     if re.compile('[^0-9a-zA-Z_]').findall(text):
         raise SyntaxError, \
-            'only [0-9a-zA-Z_] allowed in table and field names'
+            'Can\'t cleanup \'%s\': only [0-9a-zA-Z_] allowed in table and field names' % text
     return text
 
 
@@ -114,7 +114,7 @@
 
     def __setattr__(self, key, value):
         if key in self:
-            raise SyntaxError, 'Object exists and cannot be redefined'
+            raise SyntaxError, 'Object \'%s\'exists and cannot be redefined' % key
         self[key] = value
 
     def __repr__(self):
@@ -154,11 +154,11 @@
         ):
         tablename = cleanup(tablename)
         if tablename in dir(self) or tablename[0] == '_':
-            raise SyntaxError, 'invalid table name'
+            raise SyntaxError, 'invalid table name: %s' % tablename
         if not tablename in self.tables:
             self.tables.append(tablename)
         else:
-            raise SyntaxError, 'table already defined'
+            raise SyntaxError, 'table already defined: %s' % tablename
         t = self[tablename] = SQLTable(self, tablename, *fields)
         t._create()
         return t
@@ -219,21 +219,24 @@
             if field.type[:9] == 'reference':
                 referenced = field.type[10:].strip()
                 if not referenced:
-                    raise SyntaxError, 'SQLTable: reference to nothing!'
+                    raise SyntaxError, \
+                        'SQLTable %s: reference \'%s\' to nothing!' % (self._tablename, k)
                 if not referenced in self._db:
-                    raise SyntaxError, 'SQLTable: table does not exist'
+                    raise SyntaxError, \
+                        'SQLTable: table %s does not exist' % referenced
                 referee = self._db[referenced]
                 ftype = \
                     self._db._translator[field.type[:9]](
                         self._db[referenced]._tableobj)
                 if self._tablename in referee.fields:  # ## THIS IS OK
                     raise SyntaxError, \
-                        'SQLField: table name has same name as a field in referenced table'
+                        'SQLField: table \'%s\' has same name as a field ' \
+                        'in referenced table \'%s\'' % (self._tablename, referenced)
                 self._db[referenced]._referenced_by.append((self._tablename,
                         field.name))
             elif not field.type in self._db._translator\
                  or not self._db._translator[field.type]:
-                raise SyntaxError, 'SQLField: unkown field type'
+                raise SyntaxError, 'SQLField: unkown field type %s' % field.type
         self._tableobj = self._db.client
         return None
 
@@ -394,7 +397,7 @@
 
         self.name = cleanup(fieldname)
         if fieldname in dir(SQLTable) or fieldname[0] == '_':
-            raise SyntaxError, 'SQLField: invalid field name'
+            raise SyntaxError, 'SQLField: invalid field name: %s' % fieldname
         if isinstance(type, SQLTable):
             type = 'reference ' + type._tablename
         if not length and type == 'string':
@@ -508,7 +511,7 @@
                                    id=long(right))
                 return
             else:
-                raise SyntaxError, 'not supported'
+                raise SyntaxError, 'only equality by id is supported'
         raise SyntaxError, 'not supported'
 
     def __str__(self):
@@ -555,7 +558,8 @@
     def __call__(self, where):
         if isinstance(self.where, QueryException) or isinstance(where,
                 QueryException):
-            raise SyntaxError
+            raise SyntaxError, \
+                'neither self.where nor where can be a QueryException instance'
         if self.where:
             return SQLSet(self._db, self.where & where)
         else:
@@ -609,7 +613,7 @@
                 return
             self._db[tablename].delete(id)
         else:
-            raise Exception, 'not implemented'
+            raise Exception, 'deletion not implemented'
 
     def update(self, **update_fields):
         if isinstance(self.where, QueryException):
@@ -620,7 +624,7 @@
                 setattr(item, key, value)
             self._db[tablename].update(id, **item)
         else:
-            raise Exception, 'not implemented'
+            raise Exception, 'update not implemented'
 
 
 def update_record(
@@ -660,7 +664,7 @@
 
     def __getitem__(self, i):
         if i >= len(self.response) or i < 0:
-            raise SyntaxError, 'SQLRows: no such row'
+            raise SyntaxError, 'SQLRows: no such row: %i' % i
         if len(self.response[0]) != len(self.colnames):
             raise SyntaxError, 'SQLRows: internal error'
         row = SQLStorage()

=== modified file 'gluon/contrib/rss2.py'
--- gluon/contrib/rss2.py	2009-07-18 02:52:22 +0000
+++ gluon/contrib/rss2.py	2009-07-23 07:04:44 +0000
@@ -514,7 +514,7 @@
 
         if title is None and description is None:
             raise TypeError(
-                "must define at least one of 'title' or 'description'")
+                "RSSItem must define at least one of 'title' or 'description'")
         self.title = title
         self.link = link
         self.description = description

=== modified file 'gluon/contrib/simplejson/encoder.py'
--- gluon/contrib/simplejson/encoder.py	2009-05-25 03:54:40 +0000
+++ gluon/contrib/simplejson/encoder.py	2009-07-23 07:07:39 +0000
@@ -293,7 +293,7 @@
         if markers is not None:
             markerid = id(lst)
             if markerid in markers:
-                raise ValueError("Circular reference detected")
+                raise ValueError("Circular reference detected: %s" % markerid)
             markers[markerid] = lst
         buf = '['
         if _indent is not None:
@@ -346,7 +346,7 @@
         if markers is not None:
             markerid = id(dct)
             if markerid in markers:
-                raise ValueError("Circular reference detected")
+                raise ValueError("Circular reference detected: %s" % markerid)
             markers[markerid] = dct
         yield '{'
         if _indent is not None:
@@ -439,7 +439,7 @@
             if markers is not None:
                 markerid = id(o)
                 if markerid in markers:
-                    raise ValueError("Circular reference detected")
+                    raise ValueError("Circular reference detected: %s" % markerid)
                 markers[markerid] = o
             o = _default(o)
             for chunk in _iterencode(o, _current_indent_level):

=== modified file 'gluon/contrib/spreadsheet.py'
--- gluon/contrib/spreadsheet.py	2009-07-18 02:52:22 +0000
+++ gluon/contrib/spreadsheet.py	2009-07-23 07:07:58 +0000
@@ -139,7 +139,7 @@
         """
         key = str(key)
         if not self.regex.match(key):
-            raise SyntaxError, "Invalid cell name"
+            raise SyntaxError, "Invalid cell name: %s" % key
         node = Node(key, value, self.url, readonly, active, onchange)
         self.nodes[key] = node
         self[key] = value

=== modified file 'gluon/globals.py'
--- gluon/globals.py	2009-07-18 02:52:22 +0000
+++ gluon/globals.py	2009-07-23 07:10:02 +0000
@@ -111,7 +111,7 @@
 
     def render(self, *a, **b):
         if len(a) > 2:
-            raise SyntaxError
+            raise SyntaxError('Response.render can be called with two arguments, at most')
         elif len(a) == 2:
             (view, self._vars) = (a[0], a[1])
         elif len(a) == 1 and isinstance(a[0], str):
@@ -298,7 +298,7 @@
                 key = request.cookies[response.session_id_name].value
                 (record_id, unique_key) = key.split(':')
                 if record_id == '0':
-                    raise Exception
+                    raise Exception, 'record_id == 0'
                 rows = db(table.id == record_id).select()
                 if len(rows) == 0 or rows[0].unique_key != unique_key:
                     raise Exception, 'No record'

=== modified file 'gluon/highlight.py'
--- gluon/highlight.py	2009-07-18 02:52:22 +0000
+++ gluon/highlight.py	2009-07-23 07:10:52 +0000
@@ -50,7 +50,7 @@
         elif mode == 'HTML':
             self.suppress_tokens = []
         else:
-            raise SyntaxError
+            raise SyntaxError('Unknown mode: %s' % mode)
         self.mode = mode
 
     def c_tokenizer(

=== modified file 'gluon/sql.py'
--- gluon/sql.py	2009-07-18 21:40:44 +0000
+++ gluon/sql.py	2009-07-23 07:24:30 +0000
@@ -797,7 +797,8 @@
                     m = re.compile('^(?P<dsn>.+)$'
                                    ).match(self._uri[skip:])
                     if not m:
-                        raise SyntaxError, 'Parsing has no result'
+                        raise SyntaxError, \
+                            'Parsing uri string(%s) has no result' % (self._uri[skip:])
                     dsn = m.group('dsn')
                     if not dsn:
                         raise SyntaxError, 'DSN required'
@@ -986,7 +987,7 @@
 
         for key in args:
             if key != 'migrate':
-                raise SyntaxError, 'invalid table attribute: %s' % key
+                raise SyntaxError, 'invalid table \'%s\' attribute: %s' % (tablename, key)
         migrate = args.get('migrate',True)
         tablename = cleanup(tablename)
         if hasattr(self,tablename) or tablename[0] == '_':
@@ -1200,9 +1201,9 @@
             if isinstance(field.type,str) and field.type[:10] == 'reference ':
                 referenced = field.type[10:].strip()
                 if not referenced:
-                    raise SyntaxError, 'SQLTable: reference to nothing!'
+                    raise SyntaxError, 'SQLTable: reference to nothing: %s' % referenced
                 if not referenced in self._db:
-                    raise SyntaxError, 'SQLTable: table does not exist'
+                    raise SyntaxError, 'SQLTable: table \'%s\'does not exist' % referenced
                 referee = self._db[referenced]
                 if self._tablename in referee.fields:
                     raise SyntaxError, 'SQLField: table %s has same name as a field in referenced table %s' % (self._tablename, referee._tablename)
@@ -1848,7 +1849,7 @@
         try:
             m = regex_content.match(name)
             if not m or not self.isattachment:
-                raise TypeError
+                raise TypeError('Can\'t retrieve %s' % name)
             filename = base64.b16decode(m.group('name'), True)
             filename = regex_cleanup_fn.sub('_', filename)
         except (TypeError, AttributeError):
@@ -1989,7 +1990,7 @@
                 self.sql = '%s %s' % (left,
                         left._db._translator['is not null'])
             else:
-                raise SyntaxError, 'do not know what to do'
+                raise SyntaxError, 'Operation %s can\'t be used with None' % op
         elif op == ' IN ':
             if isinstance(right, str):
                 self.sql = '%s%s(%s)' % (left, op, right[:-1])
@@ -1998,7 +1999,7 @@
                              for i in right])
                 self.sql = '%s%s(%s)' % (left, op, r)
             else:
-                raise SyntaxError, 'do not know what to do'
+                raise SyntaxError, 'Right argument of \'IN\' is not suitable'
         elif isinstance(right, (SQLField, SQLXorable)):
             self.sql = '%s%s%s' % (left, op, right)
         else:
@@ -2507,7 +2508,7 @@
 
         mode = mode.lower()
         if not mode in ['object', 'array']:
-            raise SyntaxError, 'Invalid JSON serialization mode.'
+            raise SyntaxError, 'Invalid JSON serialization mode: %s' % mode
 
         def inner_loop(record, col):
             (t, f) = col.split('.')

=== modified file 'gluon/sqlhtml.py'
--- gluon/sqlhtml.py	2009-07-18 02:52:22 +0000
+++ gluon/sqlhtml.py	2009-07-23 07:26:15 +0000
@@ -775,7 +775,8 @@
             return ret
 
         if record_id and record_id != self.record_id:
-            raise SyntaxError, 'user is tampering with form'
+            raise SyntaxError, 'user is tampering with form\'s record_id: ' \
+                               '%s != %s' % (record_id, self.record_id)
 
         if requested_delete:
             self.table._db(self.table.id == self.record.id).delete()

=== modified file 'gluon/storage.py'
--- gluon/storage.py	2009-07-18 02:52:22 +0000
+++ gluon/storage.py	2009-07-23 07:27:50 +0000
@@ -103,9 +103,9 @@
     def __setattr__(self, key, value):
         if key != 'lock_keys' and self.get('lock_keys', None)\
              and not key in self:
-            raise SyntaxError, 'setting key does not exist'
+            raise SyntaxError, 'setting key \'%s\' does not exist' % key
         if key != 'lock_values' and self.get('lock_values', None):
-            raise SyntaxError, 'setting value cannot be changed'
+            raise SyntaxError, 'setting value cannot be changed: %s' % key
         self[key] = value
 
 
@@ -117,9 +117,9 @@
     def __setattr__(self, key, value):
         if key != 'lock_keys' and self.get('lock_keys', None)\
              and not key in self:
-            raise SyntaxError, 'setting key does not exist'
+            raise SyntaxError, 'setting key \'%s\' does not exist' % key
         if key != 'lock_values' and self.get('lock_values', None):
-            raise SyntaxError, 'setting value cannot be changed'
+            raise SyntaxError, 'setting value cannot be changed: %s' % key
         self[key] = value
 
     def __getattr__(self, key):

=== modified file 'gluon/tools.py'
--- gluon/tools.py	2009-07-18 02:52:22 +0000
+++ gluon/tools.py	2009-07-23 07:29:07 +0000
@@ -621,7 +621,7 @@
         elif 'email' in keys:
             username = 'email'
         else:
-            raise SyntaxError, "user must have username of email"
+            raise SyntaxError, "user must have username or email"
         table_user = self.settings.table_user
         passfield = self.settings.password_field
         users = self.db(table_user[username] == keys[username]).select()

=== modified file 'gluon/validators.py'
--- gluon/validators.py	2009-07-18 02:52:22 +0000
+++ gluon/validators.py	2009-07-23 07:31:08 +0000
@@ -1485,7 +1485,8 @@
                 h = h + 12
             if not (h in range(24) and m in range(60) and s
                      in range(60)):
-                raise ValueError
+                raise ValueError\
+                    ('Hours or minutes or seconds are outside of allowed range')
             value = datetime.time(h, m, s)
             return (value, None)
         except AttributeError:

=== modified file 'gluon/wsgiserver.py'
--- gluon/wsgiserver.py	2009-07-18 02:52:22 +0000
+++ gluon/wsgiserver.py	2009-07-23 07:32:51 +0000
@@ -818,10 +818,7 @@
                 if is_reader and thirdarg == 'ssl handshake failure':
                     return ''
                 if thirdarg == 'http request':
-
-                    # The client is talking HTTP to an HTTPS server.
-
-                    raise NoSSLError()
+                    raise NoSSLError('The client is talking HTTP to an HTTPS server')
                 raise
             if time.time() - start > self.ssl_timeout:
                 raise socket.timeout('timed out')

Reply via email to