What is the intended use of the optional
else clause of the
The statements in the
else block are executed if execution falls off the bottom of the
try - if there was no exception. Honestly, I've never found a need.
However, Handling Exceptions notes:
The use of the else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try ... except statement.
So, if you have a method that could, for example, throw an
IOError, and you want to catch exceptions it raises, but there's something else you want to do if the first operation succeeds, and you don't want to catch an IOError from that operation, you might write something like this:
try: operation_that_can_throw_ioerror() except IOError: handle_the_exception_somehow() else: # we don't want to catch the IOError if it's raised another_operation_that_can_throw_ioerror() finally: something_we_always_need_to_do()
If you just put
except would catch the second call's errors. And if you put it after the whole
try block, it'll always be run, and not until after the
else lets you make sure
IOErrors it raises aren't caught here
There is one big reason to use
else - style and readability. It's generally a good idea to keep code that can cause exceptions near the code that deals with them. For example, compare these:
try: from EasyDialogs import AskPassword # 20 other lines getpass = AskPassword except ImportError: getpass = default_getpass
try: from EasyDialogs import AskPassword except ImportError: getpass = default_getpass else: # 20 other lines getpass = AskPassword
The second one is good when the
except can't return early, or re-throw the exception. If possible, I would have written:
try: from EasyDialogs import AskPassword except ImportError: getpass = default_getpass return False # or throw Exception('something more descriptive') # 20 other lines getpass = AskPassword
Note: Answer copied from recently-posted duplicate here, hence all this "AskPassword" stuff.