Quote from `src/druntime/src`:

```
    /**
     * Returns:
* A reference to the _next error in the list. This is used when a new * $(D Throwable) is thrown from inside a $(D catch) block. The originally * caught $(D Exception) will be chained to the new $(D Throwable) via this
     * field.
     */
@property inout(Throwable) next() @safe inout return scope pure nothrow @nogc { return nextInChain; }

```

Testcode:

```
import std.stdio;
import std.exception;

private:

class E1 : Exception { mixin basicExceptionCtors; }
class E2 : Exception { mixin basicExceptionCtors; }

void foo ()
{
   try throw new E1 ("e1");
   catch (Exception e)
      throw new E2 ("e2");
}

void bar ()
{
   auto e = new E1 ("e1");
   e.next = new E2 ("e2");
   throw e;
}

void dumpall (Exception e)
{
   Throwable t = e;
   stderr.writeln ("dumpall");
   do
      stderr.writeln (t.msg);
while ((t = t.next) !is null); // XXX: Why does !!(t = t.next) not compile?
}

public void main ()
{
   try foo ();
   catch (Exception e)
      dumpall (e);

   try bar ();
   catch (Exception e)
      dumpall (e);
}

$ dmd cetest
$ ./cetest
dumpall
e2
dumpall
e1
e2
```

Would have expected two chained Exceptions in both cases. Is it permitted to append exceptions from user code?

Reply via email to