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?