Exception re-throwing helper
[[Category:]]
This recipe shows a helper function to handle the following scenario:
try { some_function(); } catch(SomeException e) { throw new SomeOtherException("Caught Exception: SomeException:\n" ~ e.toString() ); }
The program code is given in the next section.
Program Code
import std.exception;
import std.array;
template try_template(alias FE, alias TE)
{
auto ref _try(T)(lazy T expression)
{
try
{
static if(!is(T==void))
{ return ( expression() );
}
else
{ expression();
}
}
catch(FE fe)
{
throw new TE("Converting caught exception: " ~ FE.stringof ~ "\n\t> " ~ fe.toString().replace("\n", "\n\t> "));
}
}
}
mixin template try_convert(alias FE, alias TE, string name)
{
mixin(`alias try_template!(` ~ FE.stringof ~ `,` ~ TE.stringof~ `)._try ` ~ name ~ `;`);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
class FromEx: Exception
{
this(string msg, string f = __FILE__, size_t l = __LINE__)
{
super(msg, f, l);
}
}
class ToEx: Exception
{
this(string msg, string f = __FILE__, size_t l = __LINE__)
{
super(msg, f, l);
}
}
mixin try_convert!(FromEx, ToEx, "tryFT");
void from()
{
throw new FromEx("haha");
}
int from2(int x)
{
if(x == 0)
throw new FromEx("haha2");
return 123;
}
void main()
{
assertThrown!(ToEx)( tryFT(from()) );
assertThrown!(ToEx)( tryFT(from2(0)) );
assertNotThrown( tryFT(from2(999)) );
assert( 123 == tryFT(from2(999)) );
}