6

Possible Duplicate:
Python try-else

I'm not seeing the benefit of it, at least based on the example I just read in Dive Into Python:

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    getpass = AskPassword

(http://www.diveintopython.net/file_handling/index.html)

Why couldn't you achieve the same effect with the shorter/simpler:

try:
    from EasyDialogs import AskPassword
    getpass = AskPassword
except ImportError:
    getpass = default_getpass

What am I missing?

Community
  • 1
  • 1
odigity
  • 7,568
  • 4
  • 37
  • 51

2 Answers2

5

There isn't an advantage in the example, except possibly for style. 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

and

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
Bob Stein
  • 16,271
  • 10
  • 88
  • 101
Izkata
  • 8,961
  • 2
  • 40
  • 50
2

I personally find it clearer in some situations. Naturally the greater deal of code should be ran when an exception does not occur. So in a way you are saying:

try:
    this_very_dangerous_call()
except ValueError:
    # if it breaks
    handle_value_error()
else:
    continue_with_my_code()
    # more code

Thus you are visually separating the exception handling code from the rest of the code. It's like saying: "Try this, if it breaks do something, if it doesn't [insert long explanation here]"

dmg
  • 7,438
  • 2
  • 24
  • 33
  • Problem is I don't like that ordering. I think the intended/optimistic code path should be prominent, and exception handling afterwards. This pattern puts it in the middle, between the two halves of the primary paths. Doesn't sit well with me. – odigity Jan 29 '13 at 19:13
  • Well it can be used to distinguish the parts of the code that can and can't throw an exception. But this is also in a way similar to the situation where you have a function which is something like "if a then b else c" and the question being whether the "common case" (which is a lot longer and has more logic in it) should be the "then" block or the "else" block? – dmg Jan 29 '13 at 19:18
  • Also have a look at http://stackoverflow.com/questions/855759/python-try-else – dmg Jan 29 '13 at 19:27