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

There is a semantic difference between a switch and a final switch statement, defined here:
https://dlang.org/spec/statement.html#final-switch-statement

By this difference, the writer of the final switch declares, that it is unrecoverable to pass something unexpected to the switch statement. The catch of an error as you demonstrated is, therefore, a contradiction to the finality of the switch.

I mean, if you know, that something beyond the enum can be passed, use a normal switch and handle the case in the default section. If you are able to ensure, this case is unreachable, you express this knowledge/ability by the final switch and don't need the try-catch clause at all.

Reply via email to