Drawbacks of exceptions being globally allocated

Ali Çehreli acehreli at yahoo.com
Sun Aug 15 16:23:25 UTC 2021


On 8/15/21 2:10 AM, Alexandru Ermicioi wrote:

 >> This may be useful in some cases but in general, these colatteral
 >> exceptions don't carry much information and I don't think anybody
 >> looks at them. Usually, the first one is the one that explains the
 >> error case.

 > That is just an assumption.

Agreed but it's based on hands-on experience as well as exposure to 
these forums. :)

 > There could be designs where original
 > exception gets wrapped in another one

Wrapping is different and yes, it is useful. There have been cases where 
I hit a ConvException which only tells me a conversion failed. I do 
catch and augment it in outer contexts to saying something similar ot 
"That happened while doing this".

 > Regarding exception chaining, do you mean that it will automatically get
 > chained, even without explicitly passing it as constructor of wrapping
 > exception?

Yes. That's the functionality which isn't very useful because the 
collateral exceptions are usually because of the main one: Imagine the 
file system is full and a destructor cannot flush a file. The 
destructor's error is not interesting in this case.

class Main : Exception {
   this() {
     super("Main failed");
   }
}

class Dtor : Exception {
   this() {
     super("The destructor failed");
   }
}

struct S {
   ~this() {
     throw new Dtor();
   }
}

import std.stdio;

void main() {
   try {
     auto s = S();
     throw new Main();

   } catch (Exception exc) {
     stderr.writeln("Failed: ", exc.msg);
     stderr.writeln("This failed too: ", exc.next.msg);
     // (Of course, real code should stop when 'next' is null.)
   }
}

That output contains two automatically chained exceptions:

Failed: Main failed
This failed too: The destructor failed

Ali



More information about the Digitalmars-d-learn mailing list