在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样就可以知道是否有错,以及出错的原因
在使用Python语言进行编程运行时,如果Python解释器
遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常
Python脚本发生异常时,我们需要捕获并处理它,否则程序将会终止执行,因此本文接下来主要讲解三种常见的捕获异常语句,方便日后的学习复盘
1. try...except语句
语法结构
try:
<可能抛出异常的语句>
except:
<处理异常>
try代码块是执行过程中可能会抛出异常的语句
except代码块用于进行异常处理
当try代码块中的语句抛出异常时,except中的代码块将会被执行
实例
try:
num = int(input('请输入一个整数:'))
print(num * 10)
except:
print('提示:请输入整数!')
输入数字12,程序会正常运行,输出结果120
输入字母ABC,程序会抛出异常,输出结果'提示:请输入整数!'
2.try...except...else语句
语法结构
try:
<可能抛出异常的语句>
except:
<处理异常>
else:
<语句>
try...except语句后可以添加else语句,使用else语句时,必须将它放在except语句之后和try语句之后
try语句中的代码块没有发生任何异常时,else语句中的代码块将被执行(当没有错误发生时,会自动执行else语句)
实例
例1
try:
num = int(input('请输入:'))
except:
print('输入的值不是整数')
else:
print('输入的值是整数',num)
输入数字12,程序会正常运行,输出结果输入的值是整数12
输入数字2.5,程序会抛出异常,输出结果输入的值不是整数
输入字母ABC,程序会抛出异常,输出结果输入的值不是整数
例2
try:
print('try...')
res = 10 / int('2')
print('result:', res)
except ValueError as e:
print('ValueError:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')
上述代码输出结果如下所示
try...
result: 5.0
no error!
finally...
END
例3
while True:
try:
x = int(input('Enter the first number:'))
y = int(input('Enter the second number:'))
value = x / y
print('x/y is',value)
except:
print('Invalid input.Please try again!!')
else:
break
上述代码中仅当没有引发异常时,才会跳出循环(由else子句中的break语句实现),换而言之只要出现错误,程序就会要求用户提供新的输入
Enter the first number:1
Enter the second number:0
Invalid input.Please try again!!Enter the first number:1
Enter the second number:a
Invalid input.Please try again!!Enter the first number:1
Enter the second number:2
x/y is 0.5
3. try...except...finally语句
语法结构
try:
<可能抛出异常的语句>
except:
<处理异常>
finally:
<语句>
无论程序有无异常发生,finally代码块都会被执行
当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此执行完毕
实例
例1
try:
print('try...')
res = 10 / 0
print('result:', res)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
上述代码输出结果如下所示
try...
except: division by zero
finally...
END
上面的代码在计算10/0
时会产生一个除法运算错误
从输出结果可以看到,当错误发生时,后续语句print('result:', res)不会被执行,except由于捕获到ZeroDivisionError,因此执行print('except:', e),紧接着执行finally语句块中的代码print('finally...'),最后程序继续按照流程往下走,执行print('END')
例2
try:
print('try...')
res = 10 / 2
print('result:', res)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
上述代码输出结果如下所示
try...
result: 5.0
finally...
END
由于没有错误发生,所以except语句块不会被执行,但是如果有finally语句块,则一定会被执行(可以没有finally语句)
例3
可以用多个except语句来捕获不同类型的错误
try:
print('try...')
res = 10 / int('abc')
print('result:', res)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
finally:
print('finally...')
print('END')
上述代码输出结果如下所示
try...
ValueError: invalid literal for int() with base 10: 'abc'
finally...
END
使用try...except...finally捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用bar(),bar()调用foo(),结果foo()出错了,这时只要main()捕获错误就可以了(不需要在每个可能出错的地方都去捕获错误,只需要在合适的层次去捕获错误就可以达到效果,从而减少代码的书写量)
例4
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
print('Error:', e)
finally:
print('finally...')
'''
Error: division by zero
finally...
'''
main()