www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Behaviour of goto into catch blocks.

reply Iain Buclaw <ibuclaw ubuntu.com> writes:
When it comes to using goto in D, the behaviour seems to be that you cannot
enter a try block, and neither can you enter or exit from a
finally block.

What about catch blocks? It seems that there is no restrictions imposed on
them, meaning that the following is legal.


void main()
{
    goto in_catch;
    try
    {
        throw new Exception("msg");
    }
    catch (Exception e)
    {
  in_catch:
         throw e;
    }
}


As strongly as I feel that goto into catch blocks shouldn't be allowed, is this
the intended behaviour of the language? If so, why?
Sep 04 2010
parent Don <nospam nospam.com> writes:
Iain Buclaw wrote:
 When it comes to using goto in D, the behaviour seems to be that you cannot
enter a try block, and neither can you enter or exit from a
 finally block.
 
 What about catch blocks? It seems that there is no restrictions imposed on
them, meaning that the following is legal.
 
 
 void main()
 {
     goto in_catch;
     try
     {
         throw new Exception("msg");
     }
     catch (Exception e)
     {
   in_catch:
          throw e;
     }
 }
 
 
 As strongly as I feel that goto into catch blocks shouldn't be allowed, is
this the intended behaviour of the language? If so, why?

Obviously that code should be rejected -- what would be thrown? I think there's no intrinisic problem with a goto into a catch block, but in practice, it might as well be rejected, because it almost always involves bypassing a variable declaration. The spec says "It is illegal for a GotoStatement to be used to skip initializations. " though at present the compiler doesn't enforce this. I would have thought that a finally block would be OK, but the spec says: "A FinallyStatement may not exit with a goto, break, continue, or return; nor may it be entered with a goto." So presumably going into a catch block is also supposed to be illegal.
Sep 05 2010