
4.1.2 被动异常的处理
Python的异常处理方法和if结构有些类似,也是可以进行分支的结构,并且可以进行嵌套。Python的异常处理由关键字try开始的语句定义。异常处理语句有多种格式。
1.try…except语句
第1种格式是try…except语句,其格式如下,其中“[]”中的内容是可选的。

其中,try是异常处理的关键字,冒号是必需的分隔符,后续语句块需要缩进;except关键字和其下面的语句块可以有1个或多个;exceptionName是表4-1中的异常名称,是可选的;as alias也是可选的,alias表示给异常信息起个别名,可以把别名打印出来,以便知道异常的具体内容。try…except语句的执行顺序是,当执行完前语句块后,遇到try关键字,执行try关键字下的语句块1,如果执行语句块1时没有出现异常,则直接跳出try语句,执行后续语句块;如果执行语句块1时出现异常,则跳转到第1个except语句。如果没有设置异常名称exceptionName,则执行第1个except语句下的语句块2,执行完成后跳转到后续语句块;如果设置了exceptionName,当异常名称是exceptionName时,执行第1个except下的语句块,然后跳转到后续语句块,否则执行下一条except语句,直到所有的except语句执行完成。最后再执行后续语句块。
下面的程序需要输入一个正整数,计算1+2+…+n,输入正整数不会发生异常,如果输入其他字符,例如输入“shi”,在进行int(n)运算时将会报错“ValueError:invalidliteral forint()with base10:'shi'”。

为了保证用户输入正确,可在程序中增加try语句,如果第1次输入有误,再给用户一次输入的机会。现将代码修改如下:

2.try…except…else语句
这种格式是在try…except语句的基础上,增加else语句,其格式如下,其中“[ ]”中的内容是可选的。

try…except…else语句的执行顺序是,当执行try后的语句块1时,如果没出现问题,则执行else下的补充语句块;如果语句块1出现了问题,则不执行else下的补充语句块。
3.try…except…finally语句
这种格式是在第1种格式或第2种格式的基础上增加finally语句,其格式如下,其中“[]”中的内容是可选的。

try…except…finally语句中,无论try下的语句块1是否出现异常finally补充语句都会被执行。例如下面的程序,增加else和finally语句,如果第1次输入正确,则执行else和finally语句;如果第1次输入错误,则不会执行else语句,而执行finally语句。
