How to use exceptions

Christian Köstlin christian.koestlin at gmail.com
Fri Aug 12 21:41:25 UTC 2022


On 12.08.22 23:05, Christian Köstlin wrote:
> On 12.08.22 01:50, H. S. Teoh wrote:
>> ...
>  >
>> The OP's idea of wrapping throwing code with a function that tacks on
>> extra information is a good idea.  Perhaps the use of strings isn't
>> ideal, but in principle I like his idea of exceptions acquiring
>> higher-level information as it propagates up the call stack.
> 
> Thanks for the kind words ... I am still thinking how to put this
> into a nicer API ... as it is in my current demo, its not much to type
> out so I am happy with that. Actually having read the source of
> ifThrown, its amazing how lazy makes wrapping easy!
One thing that can be done is to templateize the exception handler so
that only exceptions of a certain type are handled.
```d
auto contextWithException(T, E)(lazy scope T expression, Exception 
delegate(E) handler)
{
     Exception newException;
     try
     {
         return expression();
     }
     catch (E e)
     {
         newException = handler(e);
     }
     throw newException;
}
```

which would enable something like

```d
     return  s
         .readText
         .parseJSON
         .contextWithException((UTFException e) {
             return new Exception("Cannot process UTF-8 in config 
file%s\n  %s".format(s, e.msg), e);
         })
         .contextWithException((FileException e) {
             return new Exception("Cannot process config file%s\n 
%s".format(s, e.msg), e);
         });
```

Not sure if that makes it any better though, as I have the feeling that
most exceptions need to be wrapped at least once on their way to the end
user.

kind regards,
Christian



More information about the Digitalmars-d-learn mailing list