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
```
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([], []));
}

```

I would expect that both unit tests would pass and that the unit test not crash, which it does.

Console output:
```
dub test

No source files found in configuration 'library'. Falling back to default configuration for test runner. Starting Performing "unittest" build using C:\D\dmd2\windows\bin64\dmd.exe for x86_64. Building c42_6b_testing_for_exceptions_custom_exceptions ~master: building configuration [application]
     Linking c42_6b_testing_for_exceptions_custom_exceptions
     Running c42_6b_testing_for_exceptions_custom_exceptions.exe
Unequal lengths
Unequal lengths

app.UnequalLengths@source\app.d(29): Unequal lengths
----------------
0x00007FF74E1E2967 in d_throwc
0x00007FF74E1DF034 in app.average at C:\temp\c42_p217_6b_testing_for_exceptions_custom_exceptions\source\app.d(29) 0x00007FF74E1DF23D in app.__unittest_L32_C1.__dgliteral_L38_C36 at C:\temp\c42_p217_6b_testing_for_exceptions_custom_exceptions\source\app.d(38) 0x00007FF74E1E16FB in std.exception.assertNotThrown!(app.RangeError, void).assertNotThrown at C:\D\dmd2\windows\bin64\..\..\src\phobos\std\exception.d(149) 0x00007FF74E1DF107 in app.__unittest_L32_C1 at C:\temp\c42_p217_6b_testing_for_exceptions_custom_exceptions\source\app.d(38)
0x00007FF74E1E19BD in void app.__modtest()
0x00007FF74E1F072E in int core.runtime.runModuleUnitTests().__foreachbody_L603_C5(object.ModuleInfo*) 0x00007FF74E1E8827 in int object.ModuleInfo.opApply(scope int delegate(object.ModuleInfo*)).__lambda_L2467_C13(immutable(object.ModuleInfo*)) 0x00007FF74E1EDBC4 in int rt.minfo.moduleinfos_apply(scope int delegate(immutable(object.ModuleInfo*))).__foreachbody_L582_C5(ref rt.sections_win64.SectionGroup) 0x00007FF74E1EE39C in int rt.sections_win64.SectionGroup.opApply(scope int delegate(ref rt.sections_win64.SectionGroup)) 0x00007FF74E1EDB2B in int rt.minfo.moduleinfos_apply(scope int delegate(immutable(object.ModuleInfo*))) 0x00007FF74E1E87E7 in int object.ModuleInfo.opApply(scope int delegate(object.ModuleInfo*))
0x00007FF74E1F0550 in runModuleUnitTests
0x00007FF74E1EA975 in void rt.dmain2._d_run_main2(char[][], ulong, extern (C) int function(char[][])*).runAll() 0x00007FF74E1EA8CF in void rt.dmain2._d_run_main2(char[][], ulong, extern (C) int function(char[][])*).tryExec(scope void delegate())
0x00007FF74E1EA69A in d_run_main2
0x00007FF74E1E32C9 in d_run_main
0x00007FF74E1DF282 in app._d_cmain!().main at C:\D\dmd2\windows\bin64\..\..\src\druntime\import\core\internal\entrypoint.d(29) 0x00007FF74E26652C in __scrt_common_main_seh at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288)
0x00007FFA38EFE8D7 in BaseThreadInitThunk
0x00007FFA3A78C53C in RtlUserThreadStart
1/1 modules FAILED unittests
Error Program exited with code 1

```

Reply via email to