The Right Approach to Exceptions

Alex Rønne Petersen xtzgzorex at gmail.com
Sat Feb 18 11:27:43 PST 2012


On 18-02-2012 20:20, deadalnix wrote:
> Le 18/02/2012 19:52, Andrei Alexandrescu a écrit :
>> There's a discussion that started in a pull request:
>>
>> https://github.com/alexrp/phobos/commit/4b87dcf39efeb4ddafe8fe99a0ef9a529c0dcaca
>>
>>
>>
>> Let's come up with a good doctrine for exception defining and handling
>> in Phobos. From experience I humbly submit that catching by type is most
>> of the time useless.
>>
>>
>> Andrei
>
> I think your oppinion here is shaped by C++. For what I experienced, in
> C++, exception are only usefull for very important problem you cannot
> possibly solve, and at the best log the error and exit.
>
> An exemple is std::bad_alloc .
>
> However, in D, I think this is more the role of an Errors. Exception are
> something « softer ». It will alert you on problems your program
> encounter, but that are recoverable.
>
> You cannot recover from any exception at any place (sometime, you just
> cannot at all).
>
> Let's get an exemple : your program ask a file to the user and do some
> operations with this file. If the file doesn't exists, you can prompt
> for another file to the user with a meaningful message and start again.
> However, the first version of your program can just ignore that case and
> fail with a less specific handler in firsts versions.
>
> You cannot achieve something like that if you don't have a useful type
> to rely on. Here something like FileNotFoundException is what you want.
>
> The type of the exception must depend on the problem you are facing, not
> on the module that trhow it. I see a lot of people doing the «
> MyProgramException » or « MyLibException » but that doesn't make sense.
> In this case, you are just making things harder.
>
> Back on the original subject, GetOptException is not what you want. As
> getopt is supposed to handle command line parameters, you'll use
> exception like : MissingParameterException, WrongFormatException,
> UnknowParameterException or anything that is meaningful.
>
> Those Exceptions would inherit from something like CommandLineException.
> This is useful because it describe what you are facing. Because you cant
> to know what is the problem, not which piece of code face the problem.

Point taken. I suggested GetOptException initially because, based on 
usage patterns of std.getopt, it seems to be most common to just catch 
the exception (be it a parsing error, type coercion error, or whatever) 
and print it.

>
> If this politic is choosen, then It would make sense to have several
> modules of phobos throwing exceptions of the same type, or inheriting
> from the same base class.
>
> Exception type is a convenient way to filter what you catch and what you
> don't know how to handle at this point.

-- 
- Alex


More information about the Digitalmars-d mailing list