According to the Python documentation on idioms and anti-idioms in relation to exceptions: “You should try to use as few except clauses in your code as you can — the ones you do use will usually be inside calls which should always succeed, or a catch-all in a main function.” Taking this sentence in sections…
“You should try to use as few except clauses in your code as you can”
A bit confusing for a newbie like myself, I thought it was good practise in Python to use the EAFP style -i.e. many try and except statements. Or am I missing the point?
“the ones you do use will usually be inside calls which should always succeed”
I don’t understand the point that’s being made here.
“or a catch-all in a main function.”
So it’s good style to any let code that throws an exception to simply pass it up the call stack until it reaches the top level where you have really generic exception handling?
Concerning the first point, the whole point of using exceptions is that you don’t have to wrap every line in one! E.g. in C, errors are usually determined by the return value of a function call. So you have to check those after every call if you want to catch all errors. With Python you can group a (possibly large) block of statements that go together in a try/except block and only deal with all errors once.
The second point is that (if possible) you want to solve failures close to the point where they occur. E.g. you are reading data from a network and get zero bytes. In that case it is usually perfectly allright to wait and try again.
The last point is that sometimes an error is so big that it cannot be handled at a low level. E.g. if you are trying to open a file that not exist, it wil fail. And your program cannot do whatever it was going to do with the contents of the file. It is best to handle that at the top level of the program and ask the user for another file name or maybe quit the program.