<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
Hi,<br>
<br>
David and me got into a discussion yesterday on howto deal with
errorconditions in CLAM with respect to reporting 'the right thing' to
the user. As David mentioned earlier, should we use errorcodes, typed
exceptions, diagnosis functions or ...<br>
<br>
At the moment the codebase has different styles: (boolean) returns,
asserts (that may register their own handler), throw or even exit():<br>
<br>
<tt><small>        if ( jack_port_unregister ( _jackClient,
it->jackPort) )<br>
        {<br>
            std::cerr << "JACK ERROR: unregistering port "
<< it->PortName() << std::endl;<br>
            exit(1);<br>
        }<br>
<br>
<br>
        if(infile->samplerate() != sampleRate)<br>
        {<br>
            std::cout << "All the input audio files have to have
the same sample rate" << std::endl;<br>
            exit(-1);<br>
        }<br>
<br>
<br>
</small></tt>David made the difference between 'programmer exceptions'
(violation of invariants) which may throw (and possibly terminate) and
'user exceptions' - things the user did wrong but should not terminate
the program; for instance, giving a wrong file may lead to the
samplerate exit as depicted above.<br>
<br>
For 'programmer exceptions' I like the ENFORCE idiom over (clam)assert
or 'if condition throw error' - as it says what it does, without me
interpreting code; but opinions may vary here. Either way, 'programmer
exceptions' are, well, exceptional and should be caught by the main
catchhandler, logged and the program can terminate if it pleases so.<br>
<br>
The big question now becomes, what to tell the user? The samplerate
message in the above example will not guide the user in choosing the
correct file.<br>
<br>
But maybe if it were more like:<br>
<br>
        <tt><small>std::cout << "All the input audio files have
to have the same sample rate (did you open audiofiles?)" <<
std::endl;</small></tt><br>
<br>
this would give the user a hint ...<br>
<br>
David suggested that lower level (user) exceptions should be handled by
the higher level, possibly translating them in something more
meaningfull (David, please correct me if I quote you wrong). The
problem I see with that is probably will get a large table of
'translations' and what to think of the other causes samplerates do not
match (corrupted file, ...)<br>
<br>
I would be all for a simple scheme: state your error and possibly hint
at a cause, throw and handle it as high as possible.<br>
<br>
Secondly, I have a practical question: what kind of exception should I
throw? Do I need many types or could I do with 2, one for the progammer
kind and one for the user kind (please note, I am thinking aloud here).<br>
<br>
          <tt><small>class ClamUserException : Err {} </small></tt><br>
<tt><small>        class JackException : ClamUserException {}       <br>
<br>
        if(infile->samplerate() != sampleRate) <br>
            throw JackException(</small></tt><tt><small>"All the input
audio files have to have the same sample rate");</small></tt><br>
<br>
where the userexception may be shown to the user at some point ...<br>
<br>
But I also understood this has been discussed out already - so I'd like
to know what the findings where in order to implement them to get rid
of these exit()'s ...<br>
<br>
<br>
Best, Dirk<br>
<br>
<br>
NB - how about <br>
<br>
<tt><small> ENFORCE(infile->samplerate() == sampleRate) << </small></tt><tt><small>JackException</small></tt><tt><small>
<<</small></tt><tt><small> "All the input audio files have to
have the same sample rate";</small></tt><br>
<br>
<br>
NB2 - An interesting read with nice references is <br>
<br>
    <a class="moz-txt-link-freetext" href="http://www.gamearchitect.net/Articles/ExceptionsAndErrorCodes.html">http://www.gamearchitect.net/Articles/ExceptionsAndErrorCodes.html</a> <br>
<br>
- especially the Guru of the Week reference is insightfull on
asserts/exceptions <br>
<br>
   
<a class="moz-txt-link-freetext" href="http://www.ddj.com/showArticle.jhtml;jsessionid=30ZICNMFOENVCQSNDBOCKICCJUMEKJVN?articleID=184401979">http://www.ddj.com/showArticle.jhtml;jsessionid=30ZICNMFOENVCQSNDBOCKICCJUMEKJVN?articleID=184401979</a><br>
</body>
</html>