Throw an exception but "hide" the top frame?

aldanor via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Dec 24 06:04:50 PST 2014


On Wednesday, 24 December 2014 at 13:48:26 UTC, ketmar via 
Digitalmars-d-learn wrote:
> the `object.Exception at wrap.d` is not a backtrace result, this 
> is the
> result of Exception class constructor:
>
>   this (string msg, string file=__FILE__, usize line=__LINE__, 
> Throwable next=null)
>
> it registering the file and line of exception object creation in
> COMPILE time. so you can do nothing with it, as there is no way 
> to know
> what called what in compile time.
>
> p.s. if you can use GDC, for example, and turn on debug info,
> backtrace will show you files and line numbers for every 
> address.

Hmm, that makes sense. After some pondering, I think I've hacked 
together a workaround though:

     template check(alias func) {
         auto check(string file = __FILE__, int line = 
__LINE__)(int x) {
             auto result = func(x);
             if (result < 0) // throw on negative return vaule
                 throw new Exception("%d < 0".format(result), 
file, line);
             return x; // otherwise, pass the result through
         }
     }

which produces:

     2
     object.Exception at wrap.d(23): -3 < 0
     ----------------
     .. (_Dmain+0x20) [0x448de4]


Are there any hidden downsides to doing it this way (aside from 
generating additional code on every call)?


More information about the Digitalmars-d-learn mailing list