Change the name of ArrayBoundsException in druntime
Sean Kelly
sean at invisibleduck.org
Thu Oct 23 11:57:11 PDT 2008
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.
Sean
More information about the Digitalmars-d
mailing list