On 10/14/2014 8:03 PM, Dicebot wrote:
On Saturday, 11 October 2014 at 22:06:38 UTC, Walter Bright wrote:
All assert actually does is call a function in druntime. You can override and
insert your own assert handling function, and have it do as you need. It was
deliberately designed that way.

A while ago I have been a looking for a way to throw Exception instead of Error
for failing assertions inside unittest blocks but druntime didn't seem to
provide needed context. Do you think this can be a worthy addition?

assert() in a unittest calls:

  __d_unittest(string file, uint line)

which calls:

    onUnittestErrorMsg(string file, size_t line, string msg)

which calls:

extern (C) void onAssertError( string file = __FILE__, size_t line = __LINE__ ) nothrow
    {
        if( _assertHandler is null )
            throw new AssertError( file, line );
        _assertHandler( file, line, null);
    }

You can use setAssertHandler() to set _assertHandler to do whatever you wish.

However, the compiler is still going to regard the assert() as nothrow, so the unwinding from an Exception won't happen until up stack a throwing function is encountered.

Reply via email to