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

Discussion in 'Python' started by Lie, Jan 13, 2008.

  1. Lie

    Lie Guest

    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?
    Lie, Jan 13, 2008
    #1
    1. Advertising

  2. Lie

    Chris Guest

    On Jan 13, 4:14 pm, Lie <> wrote:
    > 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?


    from sys import exc_info

    try:
    a = 1/0
    except:
    type, value, traceback = exc_info()
    raise SomeException(type)
    Chris, Jan 13, 2008
    #2
    1. Advertising

  3. Lie

    Mark Tolonen Guest

    "Lie" <> wrote in message
    news:...
    >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.

    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
    Mark Tolonen, Jan 13, 2008
    #3
  4. Lie

    Lie Guest

    On Jan 14, 1:51 am, "Mark Tolonen" <>
    wrote:
    > "Lie" <> wrote in message
    >
    > news:...
    >
    >
    >
    > >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.
    Lie, Jan 14, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alex
    Replies:
    0
    Views:
    405
  2. Patrick Kowalzick
    Replies:
    5
    Views:
    469
    Patrick Kowalzick
    Mar 14, 2006
  3. tonytech08
    Replies:
    61
    Views:
    1,287
    tonytech08
    Oct 30, 2008
  4. David
    Replies:
    2
    Views:
    504
    Mr. Arnold
    Aug 11, 2009
  5. johannes falcone
    Replies:
    6
    Views:
    991
    johannes falcone
    May 16, 2013
Loading...

Share This Page