违例节制器
虽然,生成的违例必需在某个处所中止。这个“处所”即是违例节制器可能违例节制模块。并且针对想捕捉的每种违例范例,都必需有一个相应的违例节制器。违例节制器紧接在try块后头,且用catch(捕捉)要害字标志。如下所示:
try { // Code that might generate exceptions } catch(Type1 id1) { // Handle exceptions of Type1 } catch(Type2 id2) { // Handle exceptions of Type2 } catch(Type3 id3) { // Handle exceptions of Type3 } // etc...
每个catch从句——即违例节制器——都雷同一个小型要领,它需要回收一个(并且只有一个)特定范例的自变量。可在节制器内部利用标识符(id1,id2等等),就象一个普通的要领自变量那样。我们有时也基础不利用标识符,因为违例范例已提供了足够的信息,可有效处理惩罚违例。但纵然不消,标识符也必需就位。
节制器必需“紧接”在try块后头。若“掷”出一个违例,违例节制机制就会搜寻自变量与违例范例相符的第一个节制器。随后,它会进入谁人catch从句,并认为违例已获得节制(一旦catch从句竣事,对节制器的搜索也会遏制)。只有相符的catch从句才会获得执行;它与switch语句差异,后者在每个case后都需要一个break呼吁,防备误执行其他语句。
在try块内部,请留意大量差异的要领挪用大概生成沟通的违例,但只需要一个节制器。
1. 间断与规复
在违例节制理论中,共存在两种根基要领。在“间断”要领中(Java和C++提供了对这种要领的支持),我们假定错误很是要害,没有步伐返回违例产生的处所。无论谁只要“掷”出一个违例,就表白没有步伐调停错误,并且也不但愿再返来。
另一种要领叫作“规复”。它意味着违例节制器有责任来更合法前的状况,然后取得堕落的要领,假定下一次会乐成执行。若利用规复,意味着在违例获得节制今后仍然想继承执行。在这种环境下,我们的违例更象一个要领挪用——我们用它在Java中配置各类百般非凡的情况,发生雷同于“规复”的行为(换言之,此时不是“掷”出一个违例,而是挪用一个用于办理问题的要领)。别的,也可以将本身的try块置入一个while轮回里,用它不绝进入try块,直到功效满足时为止。
从汗青的角度看,若措施员利用的操纵系统支持可规复的违例节制,最终城市用到雷同于间断的代码,并跳过规复历程。所以尽量“规复”外貌上十分不错,但在实际应用中却显得坚苦重重。个中抉择性的原因大概是:我们的节制模块必需随时寄望是否发生了违例,以及是否包括了由发生位置专用的代码。这便使代码很难编写和维护——大型系统尤其如此,因为违例大概在多个位置发生。