On Sunday, 24 February 2019 at 10:53:09 UTC, aliak wrote:
Because from what I understand, an Error is something you should not be catching and represents something unrecoverable. And it the docs say that it's unsafe to continue execution. But the following code is very recoverable and I don't see how it's unsafe to continue executing:

import optional;
import core.exception: SwitchError;

enum Enum : string {
  one = "one", two = "two"
}

Optional!Enum makeEnum(string value) {
  try {
    final switch (value) {
    case Enum.one: return some(Enum.one);
    case Enum.two: return some(Enum.two);
    }
  } catch (SwitchError) {
    return no!Enum;
  }
}

unittest {
    assert(makeEnum("one") == some(Enum.one));
    assert(makeEnum("huh") == no!Enum);
}

Cheers,
- Ali

These days you can disable the check on final switches:

-check=switch=off

However, in this case, I would say you should actually be using a normal switch because your input is not an enum and you aren't constraining its value. IMO, using any type other than an enum as the input for a final switch should be a compiler error.

Reply via email to