defining, raising and catching exceptions

Chris Hare chare at labr.net
Fri Aug 6 03:28:45 CEST 2010


On Aug 5, 2010, at 7:37 PM, MRAB wrote:

> Chris Hare wrote:
>> okay - but why does the response come back like
>> No such file or directory
>> def b
>> ('n', 'e', 't', ' ', 'a', 'l', 'r', 'e', 'a', 'd', 'y', ' ', 'r', 'u', 'n', 'n', 'i', 'n', 'g')
> The class Exception saves its arguments in the 'args' instance
> attribute, and when it prints the exception it prints those arguments:
> 
> 
> >>> e = Exception(1, 2, 3)
> >>> print e.args
> (1, 2, 3)
> >>> print e
> (1, 2, 3)
> >>> print repr(e)
> Exception(1, 2, 3)
> 
> 
> NetActiveError inherits from RuntimeError, and ultimately from
> Exception.
> 
> NetActiveError sets the 'args' attribute to its single string argument,
> and when the exception is printed out it thinks it's the arguments:
> 
> 
> >>> e.args = "string"
> >>> print e
> ('s', 't', 'r', 'i', 'n', 'g')
> >>> print repr(e)
> Exception('s', 't', 'r', 'i', 'n', 'g')
> 
> 
> The correct way to create your own exceptions is to call the
> superclass's __init__ method:
> 
> 
> >>> class NetActiveError(RuntimeError):
> ...     def __init__(self, error):
> ...         RuntimeError.__init__(self, error)
> ...
> >>> e = NetActiveError("string")
> >>> print e
> string
> >>> print repr(e)
> NetActiveError('string',)
> 
> 
>> On Aug 5, 2010, at 5:49 PM, Benjamin Kaplan wrote:
>>> What makes you think it has to do with user-defined exceptions?
>>> 
>>>>>> try :
>>> ...    raise Exception("hello")
>>> ... except Exception as (errno, errText) :
>>> ...   print "whatever"
>>> ...
>>> Traceback (most recent call last):
>>> ValueError: need more than 1 values to unpack
>>> 
>>> An Exception is an object, not a tuple of number and text.
>>> 
>>> Raise an instance of the exception, not the class:
>>> 
>>> raise NetActiveError("net already running")
>>> 
>>> And then catch the exception object
>>> 
>>> except NetActiveError as err:
>>>  print err.args
>>> 
>>> On Thu, Aug 5, 2010 at 3:41 PM, Chris Hare <chare at labr.net> wrote:
>>>> I have a block of test code, where I am trying to raise and catch my own user defined exception
>>>> 
>>>> class NetActiveError(RuntimeError):
>>>>   def __init__(self,error):
>>>>       self.args = error
>>>> 
>>>> def a():
>>>>   try:
>>>>       fh = open("me.txt", "r")
>>>>   except Exception as (errno, errText):
>>>>       print errText
>>>>   try:
>>>>       b()
>>>>   except NetActiveError as (errono, errText):
>>>>       print errno, errText
>>>> 
>>>> def b():
>>>>   print "def b"
>>>>   raise NetActiveError,"net already running"
>>>> 
>>>> 
>>>> a()
>>>> 
>>>> 
>>>> When I run it though, I get the following error:
>>>> 
>>>> chare$ python z
>>>> No such file or directory
>>>> def b
>>>> Traceback (most recent call last):
>>>> File "z", line 20, in <module>
>>>>   a()
>>>> File "z", line 12, in a
>>>>   except NetActiveError as (errono, errText):
>>>> ValueError: too many values to unpack
>>>> 
>>>> 
>>>> What am I doing wrong here?
>>>> 
> 
> -- 
> http://mail.python.org/mailman/listinfo/python-list

okay - thanks for the tutorial -- you explained what I couldn't find in the docs I looked at.  I appreciate your help




More information about the Python-list mailing list