← Back to context

Comment by ziml77

6 days ago

Just tested that in C# and it seems they made the smart decision to not allow shenanigans like that in a finally block:

CS0157 Control cannot leave the body of a finally clause

What about throwing an exception from the finally clause?

  • This loops, if that's what you're asking:

        while (true)
        {
            try
            {
                try { return; }
                finally { throw new Exception(); }
            }
            catch { }
        }

  • Yes that is the one exception (heh) to the rule unfortunately. You can throw from anywhere so it must support unwinding from any point. So if you were really intent on abusing the finally you could wrap the try-finally in a try-catch and then throw from the finally and put your continue in the catch.

The finally behave slightly different in CIL. You have protected regions and finally/fault/catch/filters handlers attached. So in order to support continue inside finally you should introduce some state machine , which is complication and generally against Roslyn design limitation.

  • ziml77's point is about the behaviour of the C# language. You seem to be talking about implementation concerns. They're not relevant.