digitalmars.D.announce - nogc v0.0.1: nogc variants of `std.exception.enforce`,
- Atila Neves (43/43) Apr 28 2017 Writing `@nogc` code? Want to throw exceptions? Yeah, I know,
Writing ` nogc` code? Want to throw exceptions? Yeah, I know,
painful. We can do this already:
void foo() nogc {
static const exception = new Exception("message can't
change");
if(<whatever>) throw exception; // no information about
<whatever> is possible
}
But, we get limited information and no information at all that's
available at runtime. We also have to have one of those
exceptions for each error condition in the function. All in all,
not ideal. So:
http://code.dlang.org/packages/nogc
And this compiles:
// text is system because it returns a slice to a static array
// if you need to store the string you'll need to make a copy
// since consecutive calls will return the same slice and it will
// be mutated
nogc system unittest { // look ma, nogc!
import nogc.conv: text;
// works with basic types and user defined structs/classes
assert(text(1, " ", "foo", " ", 2.0) == "1 foo 2.000000");
}
// enforce is safe, since it internally makes a call to `text`
but
// immediately throws an exception, and casting it to `string`
makes
// it immutable. Ugly but it works.
nogc safe unittest { // still nogc!
import nogc.exception: enforce;
import nogc.conv: text;
const expected = 1;
const actual = 1;
enforce(actual == expected, "Expected: ", expected, " but
got: ", actual);
}
Notice that you don't call `text` after the condition in
`enforce`. In practical use, I nearly always called
`std.exception.enforce` with a second argument of
`std.conv.text(...)`, so might as well make it easier here.
Obviously `enforce(<whatever>, "...")` still works since it's a
special case of passing in variadic arguments anyway.
Atila
Apr 28 2017








Atila Neves <atila.neves gmail.com>