在编写程序时我们常常会犯错,一般错误有三类:语法错误,运行时刻错误,逻辑错误。
如果解释器检测到错误就会终止程序执行,并报告错误类型。
比如下图一个0不能作为除数的异常和一个变量未被定义的异常,一旦出现,就会中止程序
我们可以用dir()命令查看异常类,以下就是python内建的一些常见的异常
这个时候就可以采用try-except语句来对异常进行捕捉处理
它的语法一般形式为
try:
raise
except Exception as err:
print(err)
当try后面的语句出现错误时,就执行except后面的语句块。
下面是分母不能为0的代码举例:
try:
num1 = int(input('Enter the first number: '))
num2 = int(input('Enter the second number: ))
print(num1 / num2)
except ZeroDivisionError as err:
print("The second number cannot be zero!')。
print(err)
这里num2不能为0 ,若输入num2为0 就执行except后的语句,输出异常原因。如果try后面的语句块没有检测到异常就跳过except,继续执行。其中print(err)可以打印出错误原因名。
我们不仅可以捕捉一个异常语句,还可以采用多个except子句和一个except块捕捉多个异常
如
#多个except
try:
num1 = int(input('Enter the first number: ))
num2 = int(input('Enter the second number: '))
print(num1 / num2)
except ValueError:
print('Please input a digit!')
except ZeroDivisionError:
print('The second number cannot be zero!)
#单个except
try:
num1 = int(input('Enter the first number: ))
num2 = int(input('Enter the second number: '))
print(num1 / num2)
except (ValueError, ZeroDivisionError):
print(' Invalid input!)
而且,try.-except可以跟else语句
try:
num1 = int(input('Enter the first number: '))
num2 = int(input('Enter the second number: '))
print(num1 / num2)
except(ValueError, ZeroDivisionError):
print("Invalid input!')
else:
print('Aha, everything is OK')
如果 在try语句下没有检测到异常,就输出’Aha, everything is OK’
另外,try.-except也可以结合finally使用。一个try可对应多个except,但try.-except只能对应一个finally。
try.-except-finally语句中,不管是否出现了 异常finally后的语句一定要执行。
最后谈一下上下文管理器和with语句
try:
f= open('data.txt')
for line in f:
print(line, end= ")
except IOError:
print('Cannot open the file!')
finally:
f.close()
这里我们采用try.-except-finally语句执行了文件的异常处理和关闭,利用maly子句进行文件的关闭,我们假设文件都不能正常打开了,那么f变量其实并没有获得值,这里程序依然会出错,我们可以采用with语句,方便地使用上下文管理器,避免异常。
with open('data.txt') as f:
for line in f:
print(line, end=' )
这里先打开data文件赋给了变量f,再进行for循环把f按行输出,
with语句在文件处理时比try.-except-finally更健壮。
如果还有疑问可以继续参考下列链接的内容
干货!python妙招-异常处理之try-except]
https://mbd.baidu.com/newspage/data/landingshare?pageType=1&isBdboxFrom=1&context=%7B%22nid%22%3A%22news_9828970968195939769%22%7D