Size: 1097
Comment: Initial version, Req for Comment.
|
Size: 2569
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 3: | Line 3: |
I (LionKimbro) don't know much about writing exception classes; Here's hoping someone rewrites this better. Exception classes are not special; You just write an ordinary class: |
Exception classes are not special, you just derive them from Exception: |
Line 9: | Line 7: |
class HostNotFound: | class HostNotFound(Exception): |
Line 12: | Line 10: |
Exception.__init__(self, 'Host Not Found exception: missing %s' % host) | |
Line 19: | Line 18: |
raise HostNotFound( "taoriver.net" ) except HostNotFound, X: print "Host Not Found:", X.host |
raise HostNotFound("taoriver.net") except HostNotFound, exc: # Handle exception. print exc # -> 'Host Not Found exception: missing taoriver.net' print exc.host # -> 'taoriver.net' |
Line 24: | Line 26: |
== Overloading __str__ == | == See Also == |
Line 26: | Line 28: |
You can overload {{{__str__}}} to get the exception to explain itself: | HandlingExceptions, TracebackModule == Questions == * How do you relay the traceback information? ''Relay the traceback information? Moving it higher up the call-stack? Could you try to explain your question?'' * When you're logging exceptions, you want access to the traceback information to. After some research, I believe what you use is extract_tb or extract_stack from the traceback module. -- LionKimbro [[DateTime(2003-09-07T15:23:43Z)]] ''Look at cgitb for how to do detailed TB introspection, and as an example of why mixing logic and (HTML) layout is a very bad thing.'' * What better exception-foo is out there? ''AlexMartelli's "Dos and Don'ts".'' * The new text involving {{{super}}} doesn't seem to work for me. Using Python 2.3: |
Line 30: | Line 47: |
class HostNotFound: def __init__( self, host ): self.host = host def __str__( self ): return "Host Not Found exception: missing %s" % self.host |
class LocalNamesSyntaxError(Exception): def __init__(self, msg): self.msg=msg super(LocalNamesSyntaxError, self)('Local Names v1.1 Syntax Error: %s' % msg) |
Line 37: | Line 53: |
That way, you only need print the exception instance: |
|
Line 40: | Line 54: |
#!python try: raise HostNotFound( "taoriver.net" ) except HostNotFound, X: print X |
Traceback (most recent call last): File "parser.py", line 92, in ? pprint.pprint(parse_text(test_string)) File "parser.py", line 69, in parse_text cursor=parse_record_type(cursor,line,results) File "parser.py", line 43, in parse_record_type raise LocalNamesSyntaxError("unrecognized v1.1 record type- require LN, NS, X, or PATTERN") File "parser.py", line 17, in __init__ super(LocalNamesSyntaxError, self)('Local Names v1.1 Syntax Error: %s' % msg) TypeError: super() argument 1 must be type, not classobj |
Line 47: | Line 66: |
I don't know if this is a good idea or not. | Is this a Python2.4 v. Python2.3 thing? Or is there a simple error in my code? -- LionKimbro |
Line 49: | Line 68: |
== Questions == | super() only works for new-style classes. Exception is still an old-style class: type 'classobj'. I've fixed the example. -- JohannesGijsbers |
Line 51: | Line 70: |
* How do you relay the traceback information? * What better exception-foo is out there? |
Thanks a lot, I was having hardtime figureing this out, as exactly the same construct worked in other places. -- HariDara It might become a 2.4 vs 2.5 thing though, as 2.5 should allow new-style classes. |
Writing Exception Classes
Exception classes are not special, you just derive them from Exception:
1 class HostNotFound(Exception):
2 def __init__( self, host ):
3 self.host = host
4 Exception.__init__(self, 'Host Not Found exception: missing %s' % host)
You may later write:
See Also
HandlingExceptions, TracebackModule
Questions
How do you relay the traceback information? Relay the traceback information? Moving it higher up the call-stack? Could you try to explain your question?
When you're logging exceptions, you want access to the traceback information to. After some research, I believe what you use is extract_tb or extract_stack from the traceback module. -- LionKimbro DateTime(2003-09-07T15:23:43Z)
Look at cgitb for how to do detailed TB introspection, and as an example of why mixing logic and (HTML) layout is a very bad thing.
- What better exception-foo is out there?
AlexMartelli's "Dos and Don'ts".
The new text involving super doesn't seem to work for me.
Using Python 2.3:
1 class LocalNamesSyntaxError(Exception):
2 def __init__(self, msg):
3 self.msg=msg
4 super(LocalNamesSyntaxError, self)('Local Names v1.1 Syntax Error: %s' % msg)
Traceback (most recent call last): File "parser.py", line 92, in ? pprint.pprint(parse_text(test_string)) File "parser.py", line 69, in parse_text cursor=parse_record_type(cursor,line,results) File "parser.py", line 43, in parse_record_type raise LocalNamesSyntaxError("unrecognized v1.1 record type- require LN, NS, X, or PATTERN") File "parser.py", line 17, in __init__ super(LocalNamesSyntaxError, self)('Local Names v1.1 Syntax Error: %s' % msg) TypeError: super() argument 1 must be type, not classobj
Is this a Python2.4 v. Python2.3 thing? Or is there a simple error in my code? -- LionKimbro
super() only works for new-style classes. Exception is still an old-style class: type 'classobj'. I've fixed the example. -- JohannesGijsbers
Thanks a lot, I was having hardtime figureing this out, as exactly the same construct worked in other places. -- HariDara
It might become a 2.4 vs 2.5 thing though, as 2.5 should allow new-style classes.