>(it reports only the first failed assert for each unit test).< I was wrong (or the behaviour on this is mutable).
Michel Fortin: > Your 'throws' template seems good. Should create std.testing and > include it there. > Also, perhaps it'd work to use a double-template for this: > template throws(Exceptions...) { > void throws(TCallable, string filename=__FILE__, int > line=__LINE__) Yes, thank you, with this suggestion of yours it works in D2 too: class FooException : Exception { this(string msg) { super(msg); } } class OtherException : Exception { this(string msg) { super(msg); } } int sqr(int x) { if (x < 0) throw new FooException(""); return x * 2; } template throws(Exceptions...) { bool throws(TCallable)(lazy TCallable callable) { try callable(); catch (Exception e) { /*static*/ foreach (Exc; Exceptions) if (cast(Exc)e !is null) return true; return false; } return !Exceptions.length; } } unittest { assert(throws!(OtherException)(sqr(-5))); assert(throws!(OtherException)( sqr(-5) )); } void main() {} But I have to wrap it into another assert like that if I want it to behave as an assert inside the unittests. With a bit more compiler support it can be possible to write that in a library. While the static throws can require more compiler support. Bye, bearophile