On Thursday, 26 October 2017 at 06:04:56 UTC, Shachar Shemesh wrote:

There's a fundamental problem with scope(exit) and scope(failure). Consider the following code:

{
  a = allocate_something();
  scope(exit) a.cleanup();

  ...

  assert(a.nothingHorribleWentWrong);
}

Ideally, if that assert fails, you'd want the core dump and backtrace from the assertion point. That's the earliest point in which the problem is visible.

Except, all too often, what will happen is that the assert will throw an AssertionError. The scope(exit) will run, and then a.cleanup will segfault because, well, something horrible *did* go wrong. This makes it much more difficult to find out what actually went wrong.

Destructors will have the same problem, right?
It seems to me that the cause of the problem is that `assert` throws instead of aborting execution right there.

-Johan

Reply via email to