Throw an exception but "hide" the top frame?

ketmar via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Dec 24 05:48:16 PST 2014


On Wed, 24 Dec 2014 13:38:59 +0000
aldanor via Digitalmars-d-learn <digitalmars-d-learn at puremagic.com>
wrote:

> Imagine there's a template that wraps arbitrary functions and may 
> throw exceptions depending on their returned values (see a 
> simplified example below). However, if an exception occurs, the 
> backtrace is pointing inside the template which is not helpful at 
> all (especially when many such functions have been wrapped). Is 
> it somehow possible to throw an exception "from the parent frame" 
> so the backtrace would never drop into the template body?
> 
> Here's an example:
> 
>      module wrap;
> 
>      import std.stdio;
>      import std.string;
> 
>      auto check(alias func)(int x) {
>          auto result = func(x);
>          if (result < 0) // throw on negative return value
>              throw new Exception("%d < 0".format(result)); // L10
>          return x; // otherwise, pass the result through
>      }
> 
>      int f(int x) {
>          return !(x % 2) ? x : -x;
>      }
> 
>      void main() {
>          import std.stdio;
>          alias g = check!f;
>          writeln(g(2)); // ok
>          writeln(g(3)); // should fail // L21
>      }
> 
> which prints something lke this when run:
> 
>      2
>      object.Exception at wrap.d(10): -3 < 0
>      ----------------
>      .. (int wrap.check!(_D4wrap1fFiZi).check(int)+0x13) [0x44cf87]
>      .. (_Dmain+0x20) [0x448da4]
> 
> Is it possible to throw an exception in a way that backtrace 
> would be more like this?
> 
>      2
>      object.Exception at wrap.d(21): -3 < 0
>      ----------------
>      .. (_Dmain+0x20) [0x448da4]
> 
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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20141224/48e7cc54/attachment.sig>


More information about the Digitalmars-d-learn mailing list