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.

Reply via email to