python try...except....else...finally处理异常

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()

所有异常类型
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值