Change the name of ArrayBoundsException in druntime
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Oct 23 12:05:57 PDT 2008
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
More information about the Digitalmars-d
mailing list