On Sunday, 10 July 2016 at 21:43:08 UTC, Chris Wright wrote:
On Sun, 10 Jul 2016 19:55:37 +0000, Superstar64 wrote:
link: https://github.com/dlang/DIPs/pull/9 file:
https://github.com/Superstar64/DIPs/blob/exception_extensions/DIPs/
DIP1001.md
So if my function calls any runtime functions -- it allocates
memory, slices an array, etc -- I can't use C-style exception
handling. Unless I manually do something like:
struct ThrowableWrapper {
Throwable error;
}
int[] foo(int i) {
try {
return [i];
} catch (Throwable t) {
throw ThrowableWrapper(t);
}
}
You could use both c style and d stack unwinding:
---
struct CustomErrorCode
{
enum __ErrorCode = true;
}
struct CustomUnwind
{
}
int foo(int[] arr, int index)
@throws(Throwable,CustomErrorCode,CustomUnwind)
{
auto val = arr[index]; // may throw RangeError with d's
existing handling
if (val == 0xdead)
{
throw CustomErrorCode(); // throws using new error code
handling
}
else if (val == 0xbad)
{
throw CustomUnwind(); // throws using new by value
unwinding
}
}
---
Or possible wrap your function in a template that catch Unwind
exceptions and throws Error Codes.