On Sunday, 30 November 2025 at 14:00:12 UTC, Brother Bill wrote:
In book "Programming in D", on page 217.
My concern is why the assertThrown!UnequalLengths unit test does not catch the custom Exception of UnequalLengths.

Is this a bug or a feature?

source/app.d
```d
import std.stdio : writeln;
import std.exception : assertThrown, assertNotThrown;

void main()
{

}

class UnequalLengths : Exception
{
this(string msg, string file = __FILE__, size_t line = __LINE__)
        {
                super(msg, file, line);
                writeln("Unequal lengths");
        }
}

class RangeError : Exception
{
this(string msg, string file = __FILE__, size_t line = __LINE__)
        {
                super(msg, file, line);
                writeln("Unequal lengths");
        }
}

void average(int[] a, int[] b)
{
        throw new UnequalLengths("Unequal lengths");
}

unittest
{
        // Must throw UnequalLengths for uneven slices
        assertThrown!UnequalLengths(average([1], [1, 2]));

// Must not throw RangeError for empty slices (it may throw other types of exceptions)
        assertNotThrown!RangeError(average([], []));
}

```

It may throw other exceptions. But those exceptions are *not caught* by `assertNotThrown`. From the docs:

Asserts that the given expression does not throw the given type of Throwable. If a Throwable of the given type is thrown, it is caught and does not escape assertNotThrown. Rather, an AssertError is thrown. **However, any other Throwables will escape.**

I can imagine a scenario where you have an exception that is a derivative of another exception. Let's say I wanted to assert that an `Exception` is thrown, but that it is not an `UnequalLengths` exception. Then you would do:

```d
assertThrown!Exception(assertNotThrown!UnequalLengths(...));
```

But other than that, specifying that a specific exception is not thrown seems to be of very limited value.

FWIW, I'd change the message in those two writelns so you can tell which one is written.

-Steve

Reply via email to