On Wednesday, 29 May 2013 at 15:11:53 UTC, Andrei Alexandrescu wrote:
I must have missed part of this - how would the desired setup work?

Andrei

Maybe something like the following would work. collectException's return value and out parameter have been swapped for demonstration - an out parameter for the result just moves the problem to the body of collectException:
----
// Can throw, and we want to catch
int createTheVar();

// Can also throw, but we don't want to catch it here
int transform(int a);

int foo()
{
        Exception e;
        const(int) i = collectException(createTheVar(), e);

        if(e)
                // Exception handling code

        return transform(i);
}
----
By removing the scope created by try-catch, the variable can be declared and initialized at the same time, satisfying the requirements of const/immutable. Further, the transform() call is left unguarded as specified.

Such a collectionException works because it can use `return` inside the try scope without broadening what it catches:
----
E collectException(T = Exception, E)(lazy E exp, out T ex)
{
        try
                return exp();
        catch(T e)
        {
                ex = e;
                return E.init; // Kind of a drawback
        }
}
----
So, I guess using another function to do the try-catch is a workable solution.

Reply via email to