posix.error is a tuple, not an object or a string as docs say

Michael P. Reilly arcege at shore.net
Tue Aug 10 15:08:26 EDT 1999


Ben Gertzfield <che at debian.org> wrote:
: Today I was trying to use the posix.fdopen() function (through
: os.fdopen() as recommended in the documentation) so that I could open
: a pre-existing file descriptor passed in through sys.argv to a normal
: Python file object.

: Obviously I want to be able to catch errors in case the file
: descriptor passed through sys.argv isn't legal, so I read the nice
: documentation for posix.error:

:    error
:           This exception is raised when a POSIX function returns a
:           POSIX-related error (e.g., not for illegal argument types). The
:           accompanying value is a pair containing the numeric error code
:           from errno and the corresponding string, as would be printed by
:           the C function perror(). See the module errno , which contains
:           names for the error codes defined by the underlying operating
:           system.

:           When exceptions are classes, this exception carries two
:           attributes, errno and strerror. The first holds the value of
:           the C errno variable, and the latter holds the corresponding
:           error message from strerror().
:           
:           When exceptions are strings, the string for the exception is
:           'os.error'; this reflects the more portable access to the
:           exception through the os module.

: This doesn't seem to be quite true, however:

: Python 1.5.1 (#1, Dec 17 1998, 20:58:15)  [GCC 2.7.2.3] on linux2
: Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
:>>> import os
:>>> try:
: ...     input = os.fdopen(42)
: ... except os.error, error:
: ...     print error 
: ... 
: (9, 'Bad file descriptor')

: 'error', in this case, is a tuple, not an object. Am I incorrect in
: thinking this? If so, how do I access the aforementioned attributes
: errno and strerror?

: Obviously it's no problem to just say:

: except os.error, error:
:     errnum, errstr = error

: but this contradicts the documentation for posix.error -- and there is
: no documentation for a separate os.error, so I assume they are one and
: the same.

: I guess I'm missing something major, but it's odd that the docs don't
: match reality at all.

: Ben

Hi Ben,

It sounds like you are using a release of either Python 1.5 or 1.5.1.
If you are using Python 1.4 or earlier, then yes, it is a tuple.  If
Python 1.5 or later, then it is an instance of an exception class.

And this is polymorphism at it's best.  From the appearance, it looks
like a tuple, but if you perform some interspection on the "error"
object, you will see it is an instance of IOError and inherits the
"__str__" method from the Exception class, which converts the arguments
to the constructor into a string.

The long and short of this is that you can use it like a tuple if more
than one argument was given, and as the object otherwise.

For some of your own reassurance, print the type of "error" in the
except clause.

  -Arcege





More information about the Python-list mailing list