On Wednesday, 26 November 2025 at 18:42:16 UTC, Brother Bill wrote:
I would expect if that is so, then the program shouldn't crash.

If this is correct, when should scope(exit), scope(success) and scope(error) be used, if ever?

Though it is not correct the scope exit clauses should be used for cleanup. Not for anything that may throw itself.


```d
import std;

enum Op { pass, fail }

int worker (Op op)
{
   scope (exit)
      writeln ("worker exit: op = ", op);

   writeln ("worker entry: op = ", op);

   final switch (op) {
      case Op.pass:
         return 0;
      case Op.fail:
         throw new Exception ("failing...");
   }
}

int doit (string [] args)
{
   scope (exit)    writeln ("scope exit");
   scope (success) writeln ("scope success");
   scope (failure) writeln ("scope failure");

enforce (args.length == 2, format ("usage: %s (pass|fail)", args [0]));

   auto op = args [1].to!Op;
   return worker (op);
}

int main (string [] args)
{
   try return doit (args);
   catch (Exception e) stderr.writeln (e.msg);
   return 1;
}
```

Reply via email to