class U0 : Exception
{
    this() @safe pure nothrow
    {
        super("U0 error message");
    }
}

class U1 : Exception
{
    this() @safe pure nothrow
    {
        super("U1 error message");
    }
}

void foo()
{
    import std.stdio;

    foreach (immutable i; 0 .. 2)
    {
        try
        {
            i.bar;
        }
        catch (U0)
        {
            "Function foo caught exception U0".writeln;
        }
    }
}

void bar(in int i) @safe pure
{
    i.baz;
}

void baz(in int i) @safe pure
{
    throw i ? new U1 : new U0;
}

void main()
{
    foo;
}