Change the name of ArrayBoundsException in druntime
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Oct 23 12:08:06 PDT 2008
Andrei Alexandrescu wrote:
> Sean Kelly wrote:
>> Andrei Alexandrescu wrote:
>>> Robert Fraser wrote:
>>>>
>>>> Option B:
>>>> ---------
>>>> try
>>>> {
>>>> new Socket(30587);
>>>> }
>>>> catch(Exception e)
>>>> {
>>>> if(e.type == ExceptionType.Socket)
>>>> printf("Could not open socket\n");
>>>> else
>>>> throw e;
>>>> }
>>>
>>> I think you'd be hard-pressed to justify the "if" inside the second
>>> example. You couldn't create a Socket, period. It doesn't matter
>>> where exactly the exception was generated from.
>>>
>>> That's one thing about large exception hierarchies: everybody can
>>> come with cute examples on how they could be useful. As soon as the
>>> rubber hits the road, however, differentiating exceptions by type
>>> becomes useless.
>>
>> It may be different in a user application, but in services it's fairly
>> common to have specialized code for handling different exception
>> types. And more importantly, it's common to want different exception
>> types to propagate to different levels for handling. Sure, one could
>> use a generic exception handler at each level that rethrows if the
>> detected type isn't one that handler cares about but why do this when
>> filtering on type is a language feature?
>>
>> For example, let's say I have a network service that's backed by a SQL
>> database. My main program loop may look something like this:
>>
>> bool connected = false;
>> while( true )
>> {
>> try
>> {
>> while( true )
>> {
>> auto r = acceptRequest();
>> scope(failure) r.tellFailed();
>> if( !connected )
>> connectToDB();
>> handleRequest( r );
>> }
>> }
>> catch( SqlException e )
>> {
>> connected = false;
>> log( e );
>> }
>> catch( Exception e )
>> {
>> log( e );
>> }
>> }
>>
>> ...
>>
>> void handleRequest( Request r )
>> {
>> scope(failure) r.tellFailed( "General error" );
>>
>> try
>> {
>> // process r
>> }
>> catch( AuthException e )
>> {
>> r.tellFailed( "Authentication failure" );
>> }
>> catch( ValidationException e )
>> {
>> r.tellFailed( "Invalid request format" );
>> }
>> }
>>
>> Being able to trap specific types of exceptions makes this code
>> cleaner and more succinct than it would be otherwise. If this weren't
>> possible I'd have to trap, check, and rethrow certain exceptions at
>> different levels to ensure that the proper handler saw them.
>
> Thanks for fueling my argument. There's duplication in code examples, as
> in many other examples I've seen in favor of by-type handling.
>
> First example:
>
> catch( Exception e )
> {
> if (e.origin = "sql") connected = false;
> log( e );
> }
>
> Less code and no duplication. Second example is even starker:
>
> catch( AuthException e )
> {
> r.tellFailed( e.toString );
> }
>
> Clearly the need is to factor in the message to print in the exception,
> at least in this case and many like it.
>
>
> Andrei
By the way, this each-exception-has-its-type crap is my #2 pet peeve
after "Follow carefully my pocket watch... OO is good for everything...
OO is good for everything... to use, inherit... to use, inherit..."
Andrei
More information about the Digitalmars-d
mailing list