Thanks for putting such a nice question , it made me learnt so many new things.
i tried playing with your code , i found the below things:
1)Here strange thing was throwing exception in catch block without declaring it or catching it there only , it tried to take the controll out of catch block , but as we know as soon as catch block finishes , it executes finally in any case and from there you have return statement which made it return to caller with no probs.
2)When i commented your devide by Zero line and removed return statement from fianly it made it to return Error as string from catch block. It worked like this :As soon as it saw return stat in catch , it jumped to execute finally block , it finished it and then came back to return stat in catch block.
3)When i just comented devide by zero line and didnt comment return in finaly it made it to return peace and once the control is gone back from finally block , then having return stat in catch doesnt make sense.This was the case in your original question.