scope(exit) and scope(failure) on Errors

Shachar Shemesh via Digitalmars-d digitalmars-d at puremagic.com
Mon Apr 25 01:42:33 PDT 2016


There is a problem with scope(exit) and scope(failure) running when 
Error types exceptions are thrown. It throws the program into code paths 
that are really not healthy.

Imagine, for example, code handling linked lists. We do manipulations on 
linked lists, and put a scope(exit) that clears stuff up.

Now imagine that somewhere inside, we have an assert that makes sure 
that everything is still in order. If it's not, then an AsserError is 
thrown, which derive from Error. The scope(exit) runs, but since things 
are not where they should be (hence the assert), we segfault. All the 
useful stuff that the assert was supposed to provide us is now gone, 
replaced by cleanup code that had no business running under those 
circumstances.

Even when not harmful, this is, often, useless. Even if the cleanup 
proceeds correctly, what is the sense of cleaning up when the program is 
in serious trouble?

The above is not categorically always true. In Weka, for example, we are 
using exceptions derived from Error to force all fibers of a certain 
logical component to exit. It is useful that these exceptions are not 
caught. In those cases, there are some types of cleanups that we do want 
to take place, but not others.

Some way to control this would be appreciated.

Shachar


More information about the Digitalmars-d mailing list