python异常处理机制中使用try…except…来进行异常处理,基本格式如下:
try:
<body>
except<ErrorTypel>:
<handler1>
except<ErrorType2>
...
举例1:
num1,num2=eval(input('Enter two numbers,separated by a comma')) #输入两个数,用逗号隔开
result=num1/num2
print('朕的睫毛能撑伞')
输入3,0,结果提示说错误,除数为零!同时“朕的睫毛能撑伞”并没有执行,因为发生错误语句中断。
Enter two numbers,separated by a comma3,0
Traceback (most recent call last):
File "D:/Python/note/test.py", line 2, in <module>
result=num1/num2
ZeroDivisionError: division by zero
如果输入的两个都不为零的数,比如3和4,但中间不是用逗号而用空格隔开,,结果也打印print语句:
Traceback (most recent call last):
File “D:/Python/note/test.py”, line 1, in
num1,num2=eval(input('Enter two numbers,separated by a comma')) #输入两个数,用逗号隔开
File "<string>", line 1
3 4
^
SyntaxError: unexpected EOF while parsing
如果我们想要提醒客户可能的输入错误,并将最后的结果打印出来,则可以用try…except …else…finally语句
try:
num1,num2=eval(input('Enter two numbers,separated by a comma')) #输入两个数,用逗号隔开
result=num1/num2
except ZeroDivisionError:
print('分母不能为零')
except SyntaxError:
print('请在两个数之间用逗号隔开')
except: #注意冒号一定要在英文格式下输入
print('检查是否输入错误')
else: #如果语法格式等都正确则进行else语句,注意冒号一定要在英文格式下输入
print('No exceptions, the result is>> ',result)#没有异议,结果为:
finally: #无论输入是否正确,都要执行finally下的语句
print('朕的睫毛能撑伞')
finally的目的是防止资源泄漏,因为无论代码有没有错误都会执行finally语句,因此可以将参数删除,文件关闭等放在finally中执行。
结果如下:
Enter two numbers,separated by a comma3,0
分母不能为零
朕的睫毛能撑伞
>>>
====================== RESTART: D:/Python/note/test.py ======================
Enter two numbers,separated by a comma3 4
请在两个数之间用逗号隔开
朕的睫毛能撑伞
>>>
====================== RESTART: D:/Python/note/test.py ======================
Enter two numbers,separated by a comma3,4
No exceptions, the result is>> 0.75
朕的睫毛能撑伞
举例2
给一个txt文本用try…except…判断文本是否存在,如果不存在则给出信息,存在则计算文本有多少单词
def count_words(filename):
try:
with open(filename) as file:
contents = file.read()
except FileNotFoundError:
msg = 'Sorry, the file '+filename+' does not exist'
print(msg)
else:
words = contents.split()
n_words = len(words)
print(n_words)
filenames = ['alice.txt','pi_digits.txt','hh.txt','little_women.txt','moby_dick.txt','siddhartha.txt']
for filename in filenames:
count_words(filename)
结果如下:
29461
3
Sorry, the file hh.txt does not exist
189079
215136
42172
>>>
另外,可以通过pass直接跳过出错的提示,并执行下一步
如将上面的列子中msg = sorry…那一栏直接改为pass,即:
def count_words(filename):
try:
with open(filename) as file:
contents = file.read()
except FileNotFoundError:
pass
else:
words = contents.split()
n_words = len(words)
print(n_words)
filenames = ['alice.txt','pi_digits.txt','hh.txt','little_women.txt','moby_dick.txt','siddhartha.txt']
for filename in filenames:
count_words(filename)
结果如下:
29461
3
189079
215136
42172
>>>
举例3
判断文本是否存在,存在则将文本打印出来,否则给出错误提示
def cats_dogs(filename):
print('Reading file:'+filename)
try:
with open(filename) as f:
contents = f.read()
except FileNotFoundError:
print('Sorry,I can not find the file '+filename)
else:
print(contents)
filenames = ['cats.txt','dogs.txt','fish.txt']
for filename in filenames:
cats_dogs(filename)
print('\n')
结果如下:
Reading file:cats.txt
cats
henry
小花狗
小白
Reading file:dogs.txt
dogs
shubao
wenjuhe
bi
Reading file:fish.txt
Sorry,I can not find the file fish.txt
>>>
举例4;
输入两个数字,用try…except…判断是否是字符,如果是字符则提示输入有误,最后将两个数字相加(如果没有输入n或者q则循环一直保持下去)
def main():
print("Enter 'q' to quit\n")
while True:
try:
x = input('Pleast enter a number>>>')
if (x == 'q'):
break
x = float(x)
y = input('Pleast enter another number>>>')
if (y == 'q'):
break
y = float(y)
except ValueError:
print('Please enter a number, not letter')
else:
sum = x+y
print('The sum of these number is '+str(sum))
dicision = input('Do you want to continue?y/n>>>')
if (dicision == 'n')or (dicision=='q'):
break
main()
所有异常类型