Programming in D page 217 - unittests for custom exceptions

Brother Bill brotherbill at mail.com
Wed Jan 21 00:08:32 UTC 2026


When running this, the unit tests for Custom Exceptions do not 
pass.
Is the mistake on my side or D's side?
Using DMD version 2.112.0 on Fedora Linux 43.

```
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("Range error");
	}
}

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

unittest
{
	// Must throw UnequalLengths for uneven slices
	assertThrown!UnequalLengths(average([1], [1, 2]));
	/* The equivalent of the line above */
	/+
	{
		auto isUnequalLengthsThrown = false;
		try
		{
			average([1], [1, 2]);
		}
		catch (UnequalLengths exc)
		{
			isUnequalLengthsThrown = true;
		}
		assert(isUnequalLengthsThrown == true);
	}
	+/

	// Must not throw RangeError for empty slices (it may throw 
other types of exceptions)
	assertNotThrown!RangeError(average([], []));
	/* The equivalent of the line above */
	/+
	{
		auto inRangeErrorThrown = false;
		try
		{
			average([1], [1, 2]);
		}
		catch (RangeError exc)
		{
			inRangeErrorThrown = true;
		}
		catch (Exception exc)
		{
			// do nothing
		}
		assert(inRangeErrorThrown == false);
	}
	+/
}
```

Terminal output:
```
bb at fedora:~/temp/c42_p217_6b_testing_for_exceptions_custom_exceptions$ dub test --force
              No source files found in configuration 'library'. 
Falling back to default configuration for test runner.
     Starting Performing "unittest" build using /usr/bin/dmd 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
Unequal lengths
Unequal lengths
app.UnequalLengths at source/app.d(29): Unequal lengths
----------------
source/app.d:29 void app.average(int[], int[]) [0x400d4c]
source/app.d:53 pure @nogc @safe void 
app.__unittest_L32_C1().__dgliteral_L53_C36() [0x400e4c]
/usr/include/dmd/phobos/std/exception.d:149 pure @safe void 
std.exception.assertNotThrown!(app.RangeError, 
void).assertNotThrown(lazy void, immutable(char)[], 
immutable(char)[], ulong) [0x402858]
source/app.d:53 void app.__unittest_L32_C1() [0x400daf]
??:? void app.__modtest() [0x402aa4]
??:? int 
core.runtime.runModuleUnitTests().__foreachbody_L603_C5(object.ModuleInfo*) [0x40ce8a]
??:? int object.ModuleInfo.opApply(scope int 
delegate(object.ModuleInfo*)).__lambda_L2519_C13(immutable(object.ModuleInfo*)) [0x40350b]
??:? int rt.minfo.moduleinfos_apply(scope int 
delegate(immutable(object.ModuleInfo*))).__foreachbody_L585_C5(ref rt.sections_elf_shared.DSO) [0x405b4b]
??:? int rt.sections_elf_shared.DSO.opApply(scope int 
delegate(ref rt.sections_elf_shared.DSO)) [0x405cd5]
??:? int rt.minfo.moduleinfos_apply(scope int 
delegate(immutable(object.ModuleInfo*))) [0x405ad9]
??:? int object.ModuleInfo.opApply(scope int 
delegate(object.ModuleInfo*)) [0x4034dd]
??:? runModuleUnitTests [0x40ccbf]
??:? void rt.dmain2._d_run_main2(char[][], ulong, extern (C) int 
function(char[][])*).runAll() [0x404a14]
??:? void rt.dmain2._d_run_main2(char[][], ulong, extern (C) int 
function(char[][])*).tryExec(scope void delegate()) [0x4049a1]
??:? _d_run_main2 [0x404917]
??:? _d_run_main [0x40471f]
/usr/include/dmd/druntime/import/core/internal/entrypoint.d:29 
main [0x400e71]
??:? [0x7fad9b9d15b4]
??:? __libc_start_main [0x7fad9b9d1667]
??:? _start [0x400b64]
1/1 modules FAILED unittests
Error Program exited with code 1
```


More information about the Digitalmars-d-learn mailing list