14

I am learning Python and have stumbled upon a concept I can't readily digest: the optional else block within the try construct.

According to the documentation:

The try ... except statement has an optional else clause, which, when present, must follow all except clauses. It is useful for code that must be executed if the try clause does not raise an exception.

What I am confused about is why have the code that must be executed if the try clause does not raise an exception within the try construct -- why not simply have it follow the try/except at the same indentation level? I think it would simplify the options for exception handling. Or another way to ask would be what the code that is in the else block would do that would not be done if it were simply following the try statement, independent of it. Maybe I am missing something, do enlighten me.

This question is somewhat similar to this one but I could not find there what I am looking for.

2 Answers 2

21

The else block is only executed if the code in the try doesn't raise an exception; if you put the code outside of the else block, it'd happen regardless of exceptions. Also, it happens before the finally, which is generally important.

This is generally useful when you have a brief setup or verification section that may error, followed by a block where you use the resources you set up in which you don't want to hide errors. You can't put the code in the try because errors may go to except clauses when you want them to propagate. You can't put it outside of the construct, because the resources definitely aren't available there, either because setup failed or because the finally tore everything down. Thus, you have an else block.

Sign up to request clarification or add additional context in comments.

3 Comments

ah, OK ... makes perfect sense. so why not put it at the end of the try section then ? is it because of the possibility that that code itself is throwing the exception and you want to limit the scope of the exception origin?
Yup. It's common practice to put it in the try in other languages, especially if there is no except block, but in Python, we have else, so we use that.
also it allows you to return from within try and have the return line throw an exception, or not :D
4

One use case can be to prevent users from defining a flag variable to check whether any exception was raised or not(as we do in for-else loop).

A simple example:

lis = range(100)
ind = 50
try:
    lis[ind]
except:
    pass
else:
    #Run this statement only if the exception was not raised
    print "The index was okay:",ind 

ind = 101

try:
    lis[ind]
except:
    pass
print "The index was okay:",ind  # this gets executes regardless of the exception

# This one is similar to the first example, but a `flag` variable
# is required to check whether the exception was raised or not.

ind = 10
try:
    print lis[ind]
    flag = True
except:
    pass

if flag:
    print "The index was okay:",ind

Output:

The index was okay: 50
The index was okay: 101
The index was okay: 10

1 Comment

But, you could just move the print-statement into the try part i.e after lis[ind] and you would get same result, right?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.