Catching a specific IO error

T

Tina I

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
 
G

Gabriel Genellina

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]"?

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
 
S

Steve Holden

Thomas said:
Tina said:
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
 
S

Steven Howe

Steve said:
Thomas said:
Tina said:
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
 
M

Michael Hoffman

Steven said:
Steve said:
Thomas said:
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.

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.
 
J

John Machin

Steve said:
Thomas said:
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.
 

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

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top