Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Catching a specific IO error

3 views
Skip to first unread message

Tina I

unread,
Apr 24, 2007, 7:44:05 AM4/24/07
to
Hi group :)

I have this standard line:

export = open(self.exportFileName , 'w')

'exportFileName' is a full path given by the user. If the user gives an
illegal path or filename the following exception is raised:
"IOError: [Errno 2] No such file or directory: /some/path/file.txt"

So at the moment I do this:

try:
export = open(self.exportFileName , 'w')
export.write("Something")
export.close()
except IOError:
# calling an error handling method.

Now, this works but of course it catches every IOError, and I can not
figure out how to restrict it to only catch the "[Errno 2]"?

Thanks
Tina

Thomas Krüger

unread,
Apr 24, 2007, 7:52:44 AM4/24/07
to
Tina I schrieb:

> Now, this works but of course it catches every IOError, and I can not
> figure out how to restrict it to only catch the "[Errno 2]"?

There's an example that uses the error number:
http://docs.python.org/tut/node10.html#SECTION0010300000000000000000

Thomas


--
sinature: http://nospam.nowire.org/signature_usenet.png

Gabriel Genellina

unread,
Apr 24, 2007, 8:02:49 AM4/24/07
to
En Tue, 24 Apr 2007 08:44:05 -0300, Tina I <tin...@bestemselv.com>
escribió:

You can get the 2 as the errno exception attribute. BTW, 2 == errno.ENOENT

try:
export = open(self.exportFileName , 'w')

except IOError, e:
if e.errno==errno.ENOENT:
# handle the "No such file or directory" error


# calling an error handling method.

See http://docs.python.org/lib/module-exceptions.html

--
Gabriel Genellina

Steve Holden

unread,
Apr 24, 2007, 8:10:43 AM4/24/07
to pytho...@python.org
Thomas Krüger wrote:
> Tina I schrieb:
>> Now, this works but of course it catches every IOError, and I can not
>> figure out how to restrict it to only catch the "[Errno 2]"?
>
> There's an example that uses the error number:
> http://docs.python.org/tut/node10.html#SECTION0010300000000000000000
>
So what you'll need to do is catch all IOError exceptions, then test to
see if you've got (one of) the particular one(s) you are interested in.
If not then you can re-raise the same error with a bare "raise"
statement, and any containing exception handlers will be triggered. If
there are none then you will see the familiar traceback termination message.

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
Recent Ramblings http://holdenweb.blogspot.com

Steven Howe

unread,
Apr 24, 2007, 2:06:35 PM4/24/07
to Steve Holden, pytho...@python.org
Steve Holden wrote:

> Thomas Krüger wrote:
>
>> Tina I schrieb:
>>
>>> Now, this works but of course it catches every IOError, and I can not
>>> figure out how to restrict it to only catch the "[Errno 2]"?
>>>
>> There's an example that uses the error number:
>> http://docs.python.org/tut/node10.html#SECTION0010300000000000000000
>>
>>
> So what you'll need to do is catch all IOError exceptions, then test to
> see if you've got (one of) the particular one(s) you are interested in.
> If not then you can re-raise the same error with a bare "raise"
> statement, and any containing exception handlers will be triggered. If
> there are none then you will see the familiar traceback termination message.
>
> regards
> Steve
>
you could also use some pre-testing of the filename os.path.isfile,
os.path.isdir, os.path.split are good
functions to test file/directory existence. Also to verify that you have
permission to manipulate a file, os.access is a good function.
sph


Michael Hoffman

unread,
Apr 24, 2007, 3:18:46 PM4/24/07
to

The try first approach is better for at least two reasons:

1) It saves you an extra stat() on the disk, which can be really
important for some filesystems I use :)

2) It is atomic. If os.path.isfile() returns True but the file is
deleted before you open it, you are still going to have to handle the
exception.
--
Michael Hoffman

John Machin

unread,
Apr 24, 2007, 9:09:22 PM4/24/07
to Steven Howe
On 25/04/2007 4:06 AM, Steven Howe wrote:
> Steve Holden wrote:
>> Thomas Krüger wrote:
>>
>>> Tina I schrieb:
>>>
>>>> Now, this works but of course it catches every IOError, and I can not
>>>> figure out how to restrict it to only catch the "[Errno 2]"?
>>>>
>>> There's an example that uses the error number:
>>> http://docs.python.org/tut/node10.html#SECTION0010300000000000000000
>>>
>>>
>> So what you'll need to do is catch all IOError exceptions, then test
>> to see if you've got (one of) the particular one(s) you are interested
>> in. If not then you can re-raise the same error with a bare "raise"
>> statement, and any containing exception handlers will be triggered. If
>> there are none then you will see the familiar traceback termination
>> message.
>>
>> regards
>> Steve
>>
> you could also use some pre-testing of the filename os.path.isfile,
> os.path.isdir, os.path.split are good
> functions to test file/directory existence.

In general, this is laborious, tedious, and possibly even platform
dependent. Then you still need to wrap the open call in try/accept. Why
bother?

In particular, (1) please explain how os.path.split helps with existence
testing:

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit
(Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
| >>> import os.path
| >>> os.path.split(r'no\such\path\nothing.nix')
('no\\such\\path', 'nothing.nix')

(2) please explain why you avoided mentioning os.path.exists.

Tina I

unread,
Apr 25, 2007, 3:01:39 AM4/25/07
to
Gabriel Genellina wrote:
> You can get the 2 as the errno exception attribute. BTW, 2 == errno.ENOENT
>
> try:
> export = open(self.exportFileName , 'w')
> except IOError, e:
> if e.errno==errno.ENOENT:
> # handle the "No such file or directory" error
> # calling an error handling method.
>
> See http://docs.python.org/lib/module-exceptions.html
>
> --Gabriel Genellina

Perfect! Just what I was looking for. Thank you! :)

Tina

0 new messages