try {
Foo( );
Bar( );
} catch( MyFirstApplicationException e1 )
{
FixProblem( e1 );
} catch( AnotherApplicationException e2 )
{
ReportErrorAndContinue( e2 );
} catch( YetAnotherApplicationException e3 )
{
ReportErrorAndShutdown( e3 );
} catch( Exception e )
{
ReportGenericError( e );
}
finally
{
CleanupResources( );
}
Foo( );
Bar( );
} catch( MyFirstApplicationException e1 )
{
FixProblem( e1 );
} catch( AnotherApplicationException e2 )
{
ReportErrorAndContinue( e2 );
} catch( YetAnotherApplicationException e3 )
{
ReportErrorAndShutdown( e3 );
} catch( Exception e )
{
ReportGenericError( e );
}
finally
{
CleanupResources( );
}
不同的catch语句可以因为不同的运行时异常而存在。你,做为库的作者,当异常的catch语句要处理不同的事情时,必须创建或者使用不同的异常类。如果不这样,你的用户就只有唯一一个无聊的选择。在任何一个异常抛出时,你可以挂起或者中止应用程序。这当然是最少的工作,但样是不可能从用户那里赢得声望的。或者,他们 可以取得异常,然后试着断定这个错误是否可以修正:
try {
Foo( );
Bar( );
} catch( Exception e )
{
switch( e.TargetSite.Name )
{
case "Foo":
FixProblem( e );
break;
case "Bar":
ReportErrorAndContinue( e );
break;
// some routine called by Foo or Bar:
default:
ReportErrorAndShutdown( e );
break;
}
} finally
{
CleanupResources( );
}
Foo( );
Bar( );
} catch( Exception e )
{
switch( e.TargetSite.Name )
{
case "Foo":
FixProblem( e );
break;
case "Bar":
ReportErrorAndContinue( e );
break;
// some routine called by Foo or Bar:
default:
ReportErrorAndShutdown( e );
break;
}
} finally
{
CleanupResources( );
}
这远不及使用多个catch语句有吸引力,这是很脆弱的代码:如果只是常规的修改了名字,它就被破坏了。如果你移动了造成错误的函数调用,放到了一个共享的工具函数中,它也被破坏了。在更深一层的堆栈上发生异常,就会使这样的结构变得更脆弱。