On 4/29/21 9:02 AM, novice2 wrote:

> format() can throw.

In order to throw for an int, I added a foo(x) expression to prove that the code works.

> I don't want embrace format into try..catch block,
> and i found elegant std.exception.ifThrown.

There are collectException and collectExceptionMsg as well. The following code works for 42 and uses the default string "error" for 43.

int foo(int x) {
  import std.exception : enforce;
  enforce(x == 42, "some error");
  return x;
}

nothrow string foo(int x, string def) {
  import std.format: format;
  import std.exception: collectException;

  string result;
  auto exc = collectException(format("%d", foo(x)), result);
  return (exc is null) ? result : def;
}

void main() {
  import std.stdio: writeln;
  writeln(foo(42, "error"));
  writeln(foo(43, "error"));
}

Ali

Reply via email to