On Tuesday, 20 January 2026 at 21:58:46 UTC, Ali Çehreli wrote:
On 1/20/26 12:42 PM, Brother Bill wrote:
> In a unittest, we have assertThrown average([1], [1, 2]));
> As assert statement throws an exception.

Yes, throws an exception but not Exception.

> But the unittest fails, which seems odd, as an assert did thr
> Have I found another bug in DMD?

I happen to have DMD64 D Compiler v2.109.1 on this environment. Your unittest passes.

What fails is the code inside 'main'.

> ```
> import std.stdio : writeln;
> import std.exception : enforce, assertThrown, assertNotThrown;
>
> void main()
> {
>      auto result = average([], []);
>
>      // assert is not caught in catch block
>      // enforce is caught in catch block
>      try
>      {
>          result = average([1], [1, 2]);
>      }
>      catch (Exception e)
>      {
>          writeln("Caught exception: ", e.msg);
>      }
> }

There is the issue: The exception type that assert throws is *not* under the Exception hierarchy but under the Error hierarchy:

 ```
            Throwable (not recommended to catch)
             ↗   ↖
    Exception     Error (not recommended to catch)
     ↗    ↖        ↗    ↖
   ...     ...    ...      ...
```

You could catch Throwable or Error. However, as they are not recommended to be caught, perhaps a better option is to change assert() to enforce(). enforce() throws a type under the Exception hierarchy.

Ali

Just curious as to why the unittest failed. After all, the assert was thrown. Is it because the try - catch block has an assert, but the catch block didn't catch it, which crashed the program before the unittest completed?

Reply via email to