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; }