On Tuesday, 5 June 2018 at 08:12:54 UTC, Shachar Shemesh wrote:
I set up to find out what happens if the assert string throws.
I have to admit I did not expect the result:
$ cat test.d
import std.stdio;
import core.exception;
void main() {
scope(failure) {
writeln("Not gonna happen");
}
try {
static string throwingFunc() {
throw new Exception("An exception");
}
assert(0==1, throwingFunc());
} catch(Exception ex) {
writeln("Exception");
} catch(AssertError ex) {
writeln("Assert");
}
}
$ ldc2 --version
LDC - the LLVM D compiler (1.8.0):
based on DMD v2.078.3 and LLVM 5.0.1
...
$ ./test
Not gonna happen
object.Exception@test.d(11): An exception
applying a bit of lowering
int Dmain (int arc, const char** argv)
{
try return main();
catch (...) dumpThrowable(); // 3 dumps exception
}
void main() {
try {
try {
static string throwingFunc() {
throw new Exception("An exception");
}
__assert_fail(throwingFunc(),...); // 1 throws
before assert throws
} catch(Exception ex) {
writeln("Exception"); // Why is this not caught?
I've no idea
} catch(AssertError ex) {
writeln("Assert"); // this is not caught because
the thrown throwable is not an exception
}
}
catch(...)
{
writeln("Not gonna happen"); // 2 scope failure is run
throw;
}
}