How to handle try-catch blocks, nothrow and logfiles
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat May 24 10:55:07 PDT 2014
On 05/24/2014 10:09 AM, Tim wrote:
> I'm working on an application where I want log all exceptions but I'm
> not sure what's the best way to realize that.
A common solution is to log it in the exception class'es constructor. We
even dump the backtrace with libunwind in our C++ application.
However, you may quickly realize that not every thrown exception is
log-worthy. The reason is, e.g. a MyMissingFile exception may not be
important when there is a default action to follow. No need to log in
that case.
Just to note, although these are valid issues, exceptions are still the
best option for error handling.
> Sure I can do the following:
>
> void myMethod() nothrow
> {
> try
> {
> // Do something
> }
> catch (Exception e)
> {
> // Write log file
> }
> }
As you say, that does not scale. :)
> 2) When I want create an application where all methods are defined
> as >nothrow< - how can I realize that? Writing to a log-file is already
> throwable.
You can bypass the compiler by wrapping the throwing expression in
assumeWontThrow (as I have shown just yesterday during my DConf
lightning talk. How timely... :))
Contrary to its name assumeWontThrow throws an Error (not Exception) if
the expression actually throws.
// This function requires that the argument is less than 10
void bar(int i)
{
import std.exception : enforce;
enforce(i < 10);
// ...
}
void foo() nothrow
{
import std.exception : assumeWontThrow;
// I know that bar(7) won't throw. So, it's
// safe to bypass the compiler in this case.
assumeWontThrow(bar(7));
/* Note: UFCS may look less natural:
*
* bar(7).assumeWontThrow;
*
* bar(7) is NOT executed before assumeWontThrow. Rather,
assumeWontThrow
* takes a lazy parameter. So, bar(7) is assumed to be nothrow.
*/
// ...
}
void main()
{
foo();
}
Ali
More information about the Digitalmars-d-learn
mailing list