Python基础-异常处理
异常是写代码的过程中经常出现的问题,也是软件构建、跟用户交互必不可少的重要内容。
在实际生活中,如果用户没有按照软件代码预想的方式进行操作,导致代码出现异常报错,就需要进行很好的异常处理,引导用户以正确方式使用软件。
异常处理主要分为以下内容:
一、异常也是一种对象
- 异常是一种Python用来管理程序执行期间发生错误的一种特殊对象;
- 异常有很多常见类型,在上图中有所穷举,适当记住一些可协助自己在写代码的过程中快速理解报错原因,高效的修改代码;
- 异常之间有些存在一定的包含关系;
二、异常的处理
1. try-except
(1)一个try VS 一个except
try:
要检测的东西(一般是怀疑可能出现报错的内容)
except Exception(一般是怀疑可能的报错类型):
与怀疑的报错一致时的处理代码
举例:
以处理ZeroDivisionError异常为例
try:
print(5/0)
except ZeroDivisionError :
print('Zero can not be divided')
(2)一个try VS 多个except
同一个try后可带有多个except,但最多只会有一个分支被执行;且当有包含关系的两种报错类型分别在两个except语句中出现,则谁先出现执行谁;
举例:
查询错误包含键错误和值错误,如果查询错误和键错误同时出现在一个try的两个except分支,则若查询错误在前,执行查询错误分支;若键错误在前,执行键错误分支;
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
x = dict1['y']
except KeyError:
print('键错误')
except LookupError:
print('查询错误')
else:
print(x)
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
x = dict1['y']
except LookupError:
print('查询错误')
except KeyError:
print('键错误')
else:
print(x)
(3)一个try VS 一个except包含多种异常类型
将多个可能的报错类型放在一个except里面,这些异常将被放在一个括号里成为一个元组
try:
s = 1 + '1'
int("abc")
f = open('test.txt')
print(f.read())
f.close()
except (OSError, TypeError, ValueError) as error:
print('出错了!\n原因是:' + str(error))
2. try-except-else
如果在try子句执行时没有发生异常,Python将执行else语句后的语句。
注意:else语句的存在必须以except语句的存在为前提,在没有except语句的try语句中使用else语句,会引发语法错误。
#执行except代码块后继续执行后续代码的例子
print('Please Enter two numbers')
print('Enter "q" to quit')
while True:
first_number=input('\nFirst number:')
if first_number=='q':
break
second_number=input('\nSecond number:')
if second_number=='q':
break
try:
answer=int(first_number)/int(second_number)
except ZeroDivisionError:
print('Zero cannot be divided. Please try another number')
else: #依赖于try代码块成功执行的代码都放在else中
print(answer)
#使用时要格外注意缩进的对齐
#这种方法一方面对用户更友好,另一方面对代码本身也更安全
3. try-except-finally
不管try子句里面有没有发生异常,finally子句都会执行。
如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出。
def divide(x,y):
try:
result=x/y
print('result is:',result)
except ZeroDivisionError:
print('division by zero!')
finally:
print('executing finally clause')
输入正确的分子分母时,正常执行,并执行finally后内容:
divide(1,2)
输入内容抛出except可捕捉的异常时,执行except后内容和finally后内容:
divide(1,0)
输入内容抛出的异常不在except可捕捉范围时,先执行finally后内容,然后再抛出异常:
divide('2','1')
4. raise——抛出异常
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
#先抛一个异常,这个异常在except里找到了对应的代码,则执行,于是输出print后的内容
三、练习
题目描述:
电脑产生一个1到10之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示太小,当用户正好猜中电脑会提示,“恭喜你猜到了这个数是…”。在用户每次猜测之前程序会输出用户是第几次猜测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"。
(尝试使用try catch异常处理结构对输入情况进行处理)
获取随机数采用random模块。
题目分析:本质是一个循环问题,需利用try对用户输入内容做特殊处理
#导入生成随机数的包
import random
#先定义count,用 count标记执行次数
count=0
random=random.randint(1,10) #随机生成一个1-10之间的整数
while True: #While True会使程序不停循环,直至预见break后跳出
temp=input('请输入:') #先提示输入内容
if temp=='q': #怕循环太久,指定一个默认字符和直接跳出结束程序,避免一直猜不到又一直要循环
count=count+1
print(count)
break #如遇输入q,则跳出循环,结束
else: #如果输出的不为q,则按正常流程判断输入值和random值的大小
try: #由于输入的可能不为要求的数值型数据,因此此处存在报错可能性,引入try
guess=int(temp)
except ValueError: #捕捉对应的报错类型
print('输入的不是整数数字,请重新输入')
else: #else后是try后内容如果正常的情况下,要执行的内容;如果输入的是正常数值型数据,则继续判断
if guess>random: #如果猜测值比random大,则提示再输入小一点的数字
print('再小一点')
count=count+1 #count累加
print(count) #执行一次,输出一次count计数
elif guess<random:
print('再大一点')
count=count+1
print(count)
else:
print('恭喜你答对了!正确数字是:',random)
break #答对后自动跳出循环
需要注意的是:在混用使用try-except和条件/循环结构时,一定要注意缩进,不然也会抛出缩进异常的错误
上一篇: Python基础——异常处理
推荐阅读
-
Python基础-异常处理
-
Python基础——异常处理
-
Python 异常处理 与 约束 详解
-
Python异常处理与内置异常(学习笔记)
-
异常处理与调试
-
python 文件追加写入_Python写入文件–解释了打开,读取,追加和其他文件处理功能...
-
Python学习笔记(基础篇)_014_GUI模块 easygui的使用 博客分类: 5.Python学习笔记 pythoneasyguigui
-
Python学习笔记(基础篇)_013_pickle模块 博客分类: 5.Python学习笔记 pythonpickle持久化
-
Python基础编程:利用列表实现简单的先进后出、先进先出
-
Python新手学习基础之条件语句——if/else语句 博客分类: Python python条件语句ifelse