Oh, I forgot about this. It does that because it starts with the innermost block, and the 'while' and 'for' statements can have an else clause.
What I'll probably do is have it so if an 'else' matches with a 'while' or 'for' loop, we'll check to see if there's an outer 'if' or 'try', and if so we'll prefer the outer indent. On the assumption that the 'else' clauses on loops are rarer than on 'if' and 'try'.
It also tempts me to put in a command that works like 'Tab cycles indent on empty line', but that works on the previous line, so you can just bang a key to get the correct indent when we choose a wrong initial indent. I wanted something like that when playing with another indent sensitive language a while back, but apparently forgot to implement it.