I just started using nothrow functions a little bit and came across the
following issue.
Some of the functions that I'd like to mark as nothrow have debug asserts
inside them.
They used to throw an Exception, but I'd like to change their behavior and
terminate an application whenever an assertion fails inside a nothrow function.
It's not very handy to write
try { assert(condition, errorMessage); } catch { abort(); }
So, how about criticalEnforce inside std.contracts? Something like this:
import std.stdio;
extern (C) void abort() nothrow;
auto tryOrDie(T)(scope lazy T dg) nothrow
{
try {
return dg();
} catch (Exception e) {
try {
writeln("Exception occurred: ", e);
} catch {
}
abort();
}
}
auto criticalEnforce(T...)(T args) nothrow
{
return tryOrDie(enforce(args));
}
BTW, an attempts to use it leads to an ICE:
Assertion failure: '0' on line 939 in file 'glue.c'