The Right Approach to Exceptions

foobar foo at bar.com
Tue Feb 21 06:38:34 PST 2012


On Tuesday, 21 February 2012 at 14:13:55 UTC, Andrei Alexandrescu 
wrote:
> On 2/21/12 4:48 AM, foobar wrote:
>> On Tuesday, 21 February 2012 at 02:23:58 UTC, Andrei 
>> Alexandrescu wrote:
>>> On 2/20/12 7:02 PM, Juan Manuel Cabo wrote:
>>>> oops, sorry!! I just saw a post by someone named Jose. My 
>>>> thousand
>>>> apollogies!!
>>>
>>> I got confused. It was your argument I meant to refer to - 
>>> adding info
>>> to the exception in flight.
>>>
>>> Andrei
>>
>> I'd implement this along these lines:
>>
>> class WithErrorCode(E) : E {
>> int errorCode;
>> this(Args)(int err, Args args) { this.errorCode = err; 
>> super(args); }
>> }
>>
>> and add this wrapper where relevant. e.g. replace:
>> throw new FileNotFoundException(...);
>> with something like:
>> throw new WithErrorCode!FileNotFoundException(-1, ...);
>>
>> This is a localized change that doesn't affect all uses of 
>> exceptions
>> and it remains type-safe. surely this is a better solution 
>> than the hash
>> table?
>
> The two approaches don't compete as one is static and the other 
> is dynamic. For example, how does one add contextual 
> information "While opening table in {database}" to the current 
> exception of type WithErrorCode!FileNotFoundException?
>
>
> Andrei

This works:
// note: the int parameter above isn't static
dbConn.query("select age from people where id='foobar'");
throw new WithErrorCode!FileNotFoundException(
           db.rs.getValue(1), "file not found");

This approach fails if you don't know ahead of time what *fields* 
you want to add to your exception but I'd argue that this is 
unrealistic. An exception is thrown as a response to a specific 
erroneous condition which means you already know *what* the 
problem is and what kind of data is needed to describe it.

Can you offer a real world use-case where the above isn't 
sufficient?


More information about the Digitalmars-d mailing list