一、前言
在程序开发时,有些错误并不是每次运行都会出现。只要输入的数据符合程序的要求,程序就可以正常运行;但如果输入的不符合程序要求,就会抛出异常并停止运行。这时,就需要在开发程序时对可能出现异常的情况进行处理。下面将详细介绍Python中提供的异常处理语句。
二、try…except 语句
在Python中,提供了try…except语句捕获异常。在使用时,把可能产生异常的代码放在try语句块中,把处理结果放在except语句块中,这样,当try语句块中的代码出现错误,就会执行except语句块中的代码,如果try语句块中的代码没有报错,那么except语句块将不会执行。具体语法格式如下:
try:
block1
except [ExceptionName [as alias]]:
block2
参数说明:
- block1:表示可能出现错误的代码块 。
- ExceptionName [as alias]:可选参数,用于指定要捕获的异常。其中,ExceptionName表示要捕获的异常名称,如果在其右侧加上“as alias”,则表示为当前的异常指定一个别名,通过该别名,可以记录异常的具体内容。
说明 :在使用try…except语句捕获异常时,如果except后面不指定异常名称,则表示捕获全部异常。
- block2:表示进行异常处理的代码块。在这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容。
说明 :使用try…except语句捕获异常后,当程序出错时,输出错误信息后,程序会继续执行。
例如,在执行除法运算时,对可能出现的异常进行处理,代码如下:
def division():
num1 = int(input("请输入被除数:")) # 用户输入提示,并记录
num2 = int(input("请输入除数:"))
result = num1 // num2 # 执行除法运算
print(result)
if __name__ == "__main__":
try: # 捕获异常
division() # 调用函数
except ZeroDivisionError: # 处理异常
print("输入错误:除数不能为0") # 输出错误原因
三、try…except…else 语句
在Python中,还有另外一种异常处理结构,它是try…except…else 语句,也就是在原来try…except语句的基础上再添加一个else句子,用于指定当try语句模块中没有出现异常时要执行的语句块。该语句块中的内容在try语句中发现异常时,将不被执行。例如,在执行除法运算时,实现当division()函数执行时没有抛出异常时,输出文字“程序执行完毕……”,代码如下:
def division():
num1 = int(input("请输入被除数:")) # 用户输入提示,并记录
num2 = int(input("请输入除数:"))
result = num1 // num2 # 执行除法运算
print(result)
if __name__ == "__main__":
try: # 捕获异常
division() # 调用函数
except ZeroDivisionError: # 处理异常
print("\n错误了:除数不能为0") # 输出错误原因
except ValueError as e: # 处理ValueError异常
print("输入错误", e) # 输出错误原因
else:
print("程序执行完成……") # 没有异常时执行
执行上面代码,将显示如下图所示:
四、try…except…finally 语句
完整的异常处理语句应包含finally代码模块,通常情况下,无论程序中有无异常产生,finally代码块中的代码都会被执行。基本格式如下:
try:
block1
except [ExceptionName [as alias]]:
block2
finally:
block3
对于try…except…finally 语句的理解并不复杂,它只是比try…except语句多了一个finally代码快,如果程序中有一些在任何情况中都必须执行的代码,那么就可以将它们放在finally语句的区块中。
说明 :使用except句子是为了允许处理异常。无论是否引发了异常,使用finally子句都可以执行。如果分配了有限的资源(如打开文件),则应该将释放资源的代码放置在finally语句的区块中。
例如,在执行除法运算时,实现当division()函数在执行时无论是否抛出异常,都输出文字“释放资源,并关闭”。修改后的代码如下:
def division():
num1 = int(input("请输入被除数:")) # 用户输入提示,并记录
num2 = int(input("请输入除数:"))
result = num1 // num2 # 执行除法运算
print(result)
if __name__ == "__main__":
try: # 捕获异常
division() # 调用函数
except ZeroDivisionError: # 处理异常
print("\n错误了:除数不能为0") # 输出错误原因
except ValueError as e: # 处理ValueError异常
print("输入错误", e) # 输出错误原因
else:
print("程序执行完成……") # 没有异常时执行
finally: # 无论是否抛出异常都执行
print("释放资源,并关闭")
执行代码,将显示如下图所示:
至此,已经介绍了异常处理语句的try…except、try…except…else 、try…except…finally等形式。下面通过下图说明异常处理的各个句子的执行关系。
五、使用raise 语句抛出异常
如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用raise 语句在函数或方法中抛出异常。raise语句的基本格式如下:
raise [ExceptionName[(reason)]]
其中,ExceptionName[(reason)]为可选参数,用于指定抛出的异常名称,以及异常信息的相关描述。如果省略,就会把当前信息的错误原样抛出。
说明 :ExceptionName[(reason)]参数中的(reason)也可以省略,如果省略,则在抛出异常时,不附带任何描述信息。
例如,在执行除法运算时,在division()函数中实现,当除数为0时,应用raise语句抛出一个ValueError异常,接下来在最后一行语句的下方添加except语句处理ValueError异常,代码如下:
def division():
num1 = int(input("请输入被除数:")) # 用户输入提示,并记录
num2 = int(input("请输入除数:"))
if num2 == 0:
raise ValueError("除数不能为0")
result = num1 // num2 # 执行除法运算
print(result)
if __name__ == "__main__":
try: # 捕获异常
division() # 调用函数
except ZeroDivisionError: # 处理异常
print("\n错误了:除数不能为0") # 输出错误原因
except ValueError as e: # 处理ValueError异常
print("输入错误", e) # 输出错误原因
else:
print("程序执行完成……") # 没有异常时执行
finally: # 无论是否抛出异常都执行
print("释放资源,并关闭")