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

L

Lie

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?
 
C

Chris

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)
 
M

Mark Tolonen

Lie said:
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
 
L

Lie

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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,832
Latest member
GlennSmall

Latest Threads

Top