#71: Better tracebacks
-------------------------------------+-------------------------------------
Reporter: Justin Walker | Owner: cwitty
(justin@… | Status: new
Type: enhancement | Milestone: sage-6.5
Priority: minor | Resolution:
Component: misc | Merged in:
Keywords: | Reviewers:
Authors: Jeroen Demeyer | Work issues:
Report Upstream: Not yet reported | Commit:
upstream; Will do shortly. | 151b6fa3bbecf2ed4914bd65454be620d47fed9a
Branch: | Stopgaps:
u/jdemeyer/ticket/71 |
Dependencies: |
-------------------------------------+-------------------------------------
Changes (by jdemeyer):
* upstream: N/A => Not yet reported upstream; Will do shortly.
Old description:
> When a .sage file is "load"ed or "attach"ed, it gets translated to a .py
> file before being processed; the result is a file with different
> structure than the original. Any errors are described in terms of the
> .py file, not the .sage file.
>
> One working solution is to monkey-patch `traceback.extract_tb()` to undo
> preparsing.
>
> Since we're messing with tracebacks anyway, this patch will also fix
> tracebacks for Cython files.
>
> The traceback below was generated with this patch. It shows the
> unpreparsed {{{1/0}}} and it also shows the Cython source:
> {{{
> sage: 1/0
> ---------------------------------------------------------------------------
> ZeroDivisionError Traceback (most recent call
> last)
> <ipython-input-1-3cdd7c9e2324> in <module>()
> ----> 1 1/0
>
> /usr/local/src/sage-config/sage/structure/element.pyx in
> sage.structure.element.RingElement.__div__
> (build/cythonized/sage/structure/element.c:17829)()
> 1891 return
> (<RingElement>self)._idiv_(<RingElement>right)
> 1892 else:
> -> 1893 return
> (<RingElement>self)._div_(<RingElement>right)
> 1894 global coercion_model
> 1895 return coercion_model.bin_op(self, right, div)
>
> /usr/local/src/sage-config/sage/rings/integer.pyx in
> sage.rings.integer.Integer._div_
> (build/cythonized/sage/rings/integer.c:12964)()
> 1795 # This is vastly faster than doing it here, since here
> 1796 # we can't cimport rationals.
> -> 1797 return the_integer_ring._div(self, right)
> 1798
> 1799 def __floordiv__(x, y):
>
> /usr/local/src/sage-config/sage/rings/integer_ring.pyx in
> sage.rings.integer_ring.IntegerRing_class._div
> (build/cythonized/sage/rings/integer_ring.c:4578)()
> 443 cdef rational.Rational x = PY_NEW(rational.Rational)
> 444 if mpz_sgn(right.value) == 0:
> --> 445 raise ZeroDivisionError, 'Rational division by zero'
> 446 mpz_set(mpq_numref(x.value), left.value)
> 447 mpz_set(mpq_denref(x.value), right.value)
>
> ZeroDivisionError: Rational division by zero
> }}}
New description:
When a .sage file is "load"ed or "attach"ed, it gets translated to a .py
file before being processed; the result is a file with different structure
than the original. Any errors are described in terms of the .py file, not
the .sage file.
One working solution is to monkey-patch `traceback.extract_tb()` to undo
preparsing.
Since we're messing with tracebacks anyway, this patch will also fix
tracebacks for Cython files. This requires an upstream patch.
The traceback below was generated with this patch. It shows the
unpreparsed {{{1/0}}} and it also shows the Cython source:
{{{
sage: 1/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call
last)
<ipython-input-1-3cdd7c9e2324> in <module>()
----> 1 1/0
/usr/local/src/sage-config/sage/structure/element.pyx in
sage.structure.element.RingElement.__div__
(build/cythonized/sage/structure/element.c:17829)()
1891 return
(<RingElement>self)._idiv_(<RingElement>right)
1892 else:
-> 1893 return
(<RingElement>self)._div_(<RingElement>right)
1894 global coercion_model
1895 return coercion_model.bin_op(self, right, div)
/usr/local/src/sage-config/sage/rings/integer.pyx in
sage.rings.integer.Integer._div_
(build/cythonized/sage/rings/integer.c:12964)()
1795 # This is vastly faster than doing it here, since here
1796 # we can't cimport rationals.
-> 1797 return the_integer_ring._div(self, right)
1798
1799 def __floordiv__(x, y):
/usr/local/src/sage-config/sage/rings/integer_ring.pyx in
sage.rings.integer_ring.IntegerRing_class._div
(build/cythonized/sage/rings/integer_ring.c:4578)()
443 cdef rational.Rational x = PY_NEW(rational.Rational)
444 if mpz_sgn(right.value) == 0:
--> 445 raise ZeroDivisionError, 'Rational division by zero'
446 mpz_set(mpq_numref(x.value), left.value)
447 mpz_set(mpq_denref(x.value), right.value)
ZeroDivisionError: Rational division by zero
}}}
--
--
Ticket URL: <http://trac.sagemath.org/ticket/71#comment:15>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica,
and MATLAB
--
You received this message because you are subscribed to the Google Groups
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-trac.
For more options, visit https://groups.google.com/d/optout.