[Tutor] Using a dictionary to map functions

Steven D'Aprano steve at pearwood.info
Tue Apr 26 08:17:53 EDT 2016


Hi Colby, and welcome!

On Tue, Apr 26, 2016 at 12:30:38AM -0400, Colby Christensen wrote:

> try:
>     infile = open(raw_input("Enter input file name; name.txt:"),'r')
> except:
>     print "Invalid filename"
>     exit()

I'm afraid that code is misleading: your error message lies.

It may not be an "invalid filename". It could be any of the following:

- an invalid file name (a file name prohibited by the operating system); 
- a valid file name that just doesn't exist; 
- a valid file name that you don't have permission to access;
- a valid file name that you can access, but a disk error occurred;
- a valid file name on a network drive, but a network error occurred; 

and probably more. There are few things more frustrating than dealing 
with programs that lie to you:

    "What do you mean, invalid filename? The file is right there, I 
    can see it! How can this stupid program not find it? I've tried
    a dozen times, double and triple checked that the file name is
    correct, and it still says the file is invalid."

Because the real error is *permission denied*, not invalid file name.

Python spends a lot of effort to give detailed and useful error messages 
when an error occurs. For example, if you try to open a file that 
doesn't exist, Python reports:

IOError: [Errno 2] No such file or directory

and tells you the name of the file that you tried to open. If you don't 
have permission to access it, it reports:

IOError: [Errno 13] Permission denied

and again reports exactly what went wrong.

Python provides you with a detailed error message telling you exactly 
what went wrong, and you throw that away, replacing it with a generic 
message which will be wrong more often than right. Please don't do that 
-- trust me, you will come to regret it.

In this case, the right way to deal with errors opening the file is... 
not to deal with them at all. Instead of this:

try:
    infile = open(raw_input("Enter input file name; name.txt:"),'r')
except:
    print "Invalid filename"
    exit()

just write this:

infile = open(raw_input("Enter input file name; name.txt:"),'r')

(There are alternatives that are even better, but you probably haven't 
learned about them yet.)



-- 
Steve


More information about the Tutor mailing list