python异常处理try-except语句
1 为什么⽤try-except语句
⾸先我们来说说,为什么要⽤try-except 语句。简单来说,为了避免程序意外退出,⽽需要使⽤的语句。
⾸先来看⼀段代码,你会更加容易理解:
try:
1/0
except ZeroDivisionError:
print('Divided by zero')
print('Should reach here')
执⾏后:
Divided by zero
Should reach here
试想⼀下,如果我们直接⽤1/0,执⾏后会出现什么错误?
*** ZeroDivisionError: division by zero
那么我们并不想因为这样⼀个错误⽽意外退出程序,从⽽影响后⾯的程序的执⾏,这时候⽤try-except就能够很好的解决这个问题。
2 怎么使⽤try-except语句
2.1 try - except
基本结构:
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
⾸先执⾏检测范围指⽰位置的程序
如果没有发⽣异常,忽略except⼦句,继续执⾏try语句后⾯的语句。代码如下:
try:
1/1
except ZeroDivisionError:
print('Divided by zero')
print('Should reach here')
执⾏结果:
Should reach here
如果在执⾏try(检测范围内)⼦句的过程中发⽣了异常,那么发⽣异常后的余下的字句将会被忽略。(如下⾯代码中 a=2 及print(a)就被忽略)。如果异常的类型和except之后的名称相符,那么对应的except⼦句将被执⾏。(如下⾯代码中 print(‘Divided by zero’)被执⾏。⽆论上述哪种情况,try以后的
语句都会被执⾏(print(‘Should reach here’))。
try:
1/0
a =2
print(a)
except ZeroDivisionError:
print('Divided by zero')
python的try和except用法print('Should reach here')
执⾏结果:
Divided by zero
Should reach here
如果⼀个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。⽐如下图中,若⼀个异常不能在Exception层中到,则会报⼀个BaseException异常。
⼀个try语句可能包含多个except⼦句,分别来处理不同的特定的异常。最多只有⼀个分⽀会被执⾏。
⽐如,如下代码中,尽管s = 1 + '1'有类型错误,f = open('')有打开⽂件错误,但是只能有⼀个分⽀被执⾏。
try:
int("abc")
s =1+'1'
f =open('')
ad())
f.close()
except OSError as error:
print('打开⽂件出错\n原因是:'+str(error))
except TypeError as error:
print('类型出错\n原因是:'+str(error))
except ValueError as error:
print('数值出错\n原因是:'+str(error))
数值出错
原因是:invalid literal for int()with base 10:'abc'
因此,在设置异常排序时,常常要将最具针对性的异常排到最前⾯,最通⽤的异常排到后⾯。如下⾯代码:
dict1 ={'a':1,'b':2,'v':22}
try:
x = dict1['y']
except LookupError:
print('查询错误')
except KeyError:
print('键错误')
else:
print(x)
# 查询错误
try-except-else语句尝试查询不在dict中的键值对,从⽽引发了异常。这⼀异常准确地说应属于KeyError,但由于KeyError是LookupError的⼦类,且将LookupError置于KeyError之前,因此程序优先执⾏该except代码块。最后报出“查询错误”,⽽未能准确定位到“键错误”。正确的打开⽅式如下:
dict1 ={'a':1,'b':2,'v':22}
try:
x = dict1['y']
except KeyError:
print('键错误')
except LookupError:
print('查询错误')
else:
print(x)
# 键错误
⼀个 except ⼦句可以同时处理多个异常,这些异常将被放在⼀个括号⾥成为⼀个元组。
try:
s =1+'1'
int("abc")
f =open('')
ad())
f.close()
except(OSError, TypeError, ValueError)as error:
print('出错了!\n原因是:'+str(error))
2.2 try - except - finally
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
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")
divide(2,1)
# result is 2.0
# executing finally clause
divide(2,0)
# division by zero!
# executing finally clause
divide("2","1")
# executing finally clause
# TypeError: unsupported operand type(s) for /: 'str' and 'str'
2.3 try - except - else
如果在try⼦句执⾏时没有发⽣异常,Python将执⾏else语句后的语句。
try:
检测范围
except:
出现异常后的处理代码
else:
如果没有异常执⾏这块代码
使⽤except⽽不带任何异常类型,这不是⼀个很好的⽅式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。
try:
检测范围
except(Exception1[, Exception2[,...ExceptionN]]]):
发⽣以上多个异常中的⼀个,执⾏这块代码
else:
如果没有异常执⾏这块代码
⽐如下⾯程序:注意open语句中的"w",如果没有testfile,会⾃动创建⼀个。
try:
fh =open("testfile","w")
fh.write("这是⼀个测试⽂件,⽤于测试异常!!")
except IOError:
print("Error: 没有到⽂件或读取⽂件失败")
else:
print("内容写⼊⽂件成功")
fh.close()
注意:else语句的存在必须以except语句的存在为前提,在没有except语句的try语句中使⽤else语句,会引发语法错误。
2.4 raise语句
练习题
1、猜数字游戏
题⽬描述:
电脑产⽣⼀个零到100之间的随机数字,然后让⽤户来猜,如果⽤户猜的数字⽐这个数字⼤,提⽰太⼤,否则提⽰太⼩,当⽤户正好猜中电脑会提⽰,“恭喜你猜到了这个数是…”。在⽤户每次猜测之前程序会输出⽤户是第⼏次猜测,如果⽤户输⼊的根本不是⼀个数字,程序会告诉⽤户"输⼊⽆效"。
(尝试使⽤try catch异常处理结构对输⼊情况进⾏处理)
获取随机数采⽤random模块。
import random
target = random.randint(0,100)
print('猜测⼀个0到100之间的整数')
num =1
while True:
guessStr =input('第%d次猜,请输⼊⼀个整数数字:'% num) try:
if type(eval(guessStr))==int:
guessNum =int(guessStr)
if guessNum < target:
print('太⼩')
elif guessNum > target:
print('太⼤')
else:
print('恭喜您猜到了,这个数是%d'% guessNum)
break
except:
pass
print('输⼊⽆效')
num+=1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论