Exceptions - How do you make it work like built-in exceptions?

Lie Lie.1296 at gmail.com
Mon Jan 14 19:45:08 CET 2008


On Jan 14, 1:51 am, "Mark Tolonen" <mark.e.tolo... at mailinator.com>
wrote:
> "Lie" <Lie.1... at gmail.com> wrote in message
>
> news:7888e20f-0775-46c4-a6e2-3fc3825c5145 at e23g2000prf.googlegroups.com...
>
>
>
> >A built-in exceptions, when raised, would print traceback that points
> > out the offending code, like this:
>
> > Traceback (most recent call last):
> >  File "F:\dir\code.py", line 43, in <module>
> >    a = 1/0 <<<---
> > ZeroDivisionError: integer division or modulo by zero
>
> > a user-made exception, when raised, would print traceback that points
> > out the code that raises the exception
>
> > Traceback (most recent call last):
> >  File "F:\dir\code.py", line 48, in <module>
> >    raise SomeException('Some Exception Message') <<<---
> > SomeException: Some Exception Message
>
> > which is generally of little use (yeah, it's possible to trace the
> > code from the line number, but sometimes it might not be that easy,
> > cause the line number is (again) the line number for the raising code
> > instead of the offending code)
>
> > The sample exception was generated from this code:
> > ####
> > class SomeException(Exception):
> >    pass
>
> > try:
> >    a = 1/0
> > except:
> >    raise SomeException('Some Exception Message')
> > ####
>
> > Is it possible to make the user-made exception points out the
> > offending code?
>
> The raise statement *was* the offending (unhandled exception) code.  The
> ZeroDivisionError was handled by your except clause.
>

Well, what you meant by offending code and what I meant by offending
code is different, what I meant by offending code as the code that
makes the exception _need_ to be called (i.e. the a=1/0) and in my
view (in this case), anything inside the except clause is not a real
code, as it doesn't do anything "useful" for the program.

> You can override the traceback your exception will use with the
> three-expression form of the raise statement (See Section 6.9 "The raise
> statement" in the Python Reference Manual) by passing the traceback of the
> original exception:
>
> ###### CODE #####
>
> import sys
>
> class SomeException(Exception):
>     pass
>
> try:
>     a=1/0
> except:
>     org_type,org_value,org_traceback = sys.exc_info()
>     raise SomeException,'had some problems with this code',org_traceback
>
> ###### OUTPUT ######
>
> Traceback (most recent call last):
>   File "exc.py", line 7, in <module>
>     a=1/0
> SomeException: had some problems with this code
>
> --Mark

Thanks.



More information about the Python-list mailing list