Catch block not hit in unittest
Lucia Cojocaru via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Nov 24 07:41:12 PST 2016
On Thursday, 24 November 2016 at 14:47:32 UTC, Jonathan M Davis
wrote:
> On Thursday, November 24, 2016 13:42:25 Kagamin via
> Digitalmars-d-learn wrote:
>> Linux? Probably another bug.
>> Try this:
>> unittest
>> {
>> import core.exception : UnicodeException;
>> void f()
>> {
>> string ret;
>> int i = -1;
>> ret ~= i;
>> }
>>
>> try
>> {
>> f();
>> }
>> catch(UnicodeException e)
>> {
>> assert(e.msg == "Invalid UTF-8 sequence");
>> }
>> }
>
> If you're doing that, you might as well use
> std.exception.assertThrown or collectException. e.g.
>
> assertThrown!UnicodeException(f());
>
> or
>
> assert(collectException!UnicodeException(f()).msg ==
> "Invalid UTF-8 sequence.");
>
> You could also do the same with a lambda to avoid the explicit
> function.
>
> Regardless, I don't know why the OP is hitting this problem,
> and unfortunately, I can't test it on my local machine at the
> moment to try and see what's going on.
>
> - Jonathan M Davis
Thanks Kagamin and Jonathan for your suggestions!
I was able to hack my way around it. In druntime there are other
modules which need the exact same thing and have their own
assertThrown template:
https://github.com/dlang/druntime/search?utf8=%E2%9C%93&q=assertThrown
So I did the same thing and defined assertThrown in my unittest.
Now it works fine:
unittest
{
import core.exception : UnicodeException;
static void assertThrown(T : Throwable = Exception, E)(lazy E
expr, string msg)
{
try
expr;
catch (T e) {
assert(e.msg == msg);
return;
}
}
static void f()
{
string ret;
int i = -1;
ret ~= i;
}
assertThrown!UnicodeException(f(), "Invalid UTF-8 sequence");
}
It is still unclear why this approach is necessary.
Thanks,
Lucia
More information about the Digitalmars-d-learn
mailing list