前言
相信很多同学写代码的时候都会被乱七八糟的程序报错所折磨,有的时候只出现了一个小错误就导致程序不能运行,然后下面跳出来一大堆的错误信息,看着就脑壳痛。如果是我们开发的应用程序像这样一出错程序就不能运行的话,你用的时候会舒服吗?但是错误又是不可避免的,任何程序都会有bug。如果能有一种机制,程序出了错他还能接着运行,然后会告诉开发者哪里出了错的话是不是很nice!这就是Python中的异常处理机制,很多程序设计语言都有异常处理,像C++和Java都有异常处理,Python中的异常处理语法和他们差不多,下面我就来介绍一下。
简单的异常捕获
请看代码:
num = int(input("请输入一个整数: "))
print(num)
用int限制我们输入的数据为整型,如果我们输入的是不是整型的话,程序就会报错,错误信息如下:
但是人难免会犯错,像是手误输错了,一报错的话程序就会宕机,就像是QQ登录的的时候叫你输入QQ账号,账号应该是数字吧,如果你看错了输个字母进去了,然后没有加入异常处理的话,程序直接闪退,然后又得打开程序重来,要是开发出这样的软件,会有谁来用呢!
如果我们加入异常处理:
try:
# 不能确定正确执行的代码
num = int(input("请输入一个整数: "))
except:
# 错误处理的代码
num = int(input("请输入正确的整数: "))
print(num)
然后再输入一个字符串的话会出现什么结果呢?
try语句后面是一个可能出现错误的代码块,如果程序在此处报错,会跳进except后面的代码块,执行里面的语句,这就是Python异常处理的基本语法。
捕获错误类型
except后面可以啥也没有,也可以接一个错误类型,不同的错误类型可以执行不同的语句,提供多样化的异常处理。
try:
# 提示用户输入一个整数
num = int(input("请输入一个整数:"))
# 使用8除以用户输入的整数并且输出
result = 8 / num
print(result)
except ZeroDivisionError:
print("除0错误")
except ValueError:
print("请输入正确的整数")
错误类型可以在pycharm报错的下面查看到,所以我们编写程序的报错还是有点用处的。写程序的时候不怕报错,错误越多,对我们越是一种警醒。
如果某个错误不知道是什么类型,Python也能处理:加上这句代码except Exception as result:就能对错误类型进行输出。
完整的异常捕获语法
一个完整的异常捕获有五个部分:
- try语句:可能会出错的地方。
- except:知道的可能出现的错误类型。
- except Exception as …:未知的错误类型。
- else:没有错误正常执行的代码。
- finally:无论是否出错都会执行的代码。
try:
# 提示用户输入一个整数
num = int(input("请输入一个整数:"))
# 使用8除以用户输入的整数并且输出
result = 8 / num
print(result)
except ValueError:
print("请输入正确的整数")
except Exception as result:
print("未知错误 %s" % result)
else:
print("尝试成功")
finally:
print("无论是否出现错误都会执行的代码")
异常的传递
异常具有传递性,也就是说某处出现的异常,不一定非要在该处处理,我们可以在他被调用的时候来处理,例如某个函数出现了异常,我们可以在主程序调用函数的时候来处理这个异常。
def demo1():
return int(input("输入整数: "))
def demo2():
return demo1()
# 利用异常的传递性,在主程序捕获异常
try:
print(demo2())
except Exception as result:
print("未知错误 %s" % result)
抛出异常
Python使用raise语句来抛出异常,raise后面接的必须是一个异常类型,也就是说:停止运行这个函数中的代码,将程序执行转到except语句。
def input_password():
# 1.提示用户输入密码
pwd = input("请输入密码: ")
# 2.判断密码长度
if len(pwd) >= 8:
return pwd
# 3.如果<8主动抛出异常
print("主动抛出异常")
# 1>创建异常对象-可以使用错误信息字符串作为参数
ex = Exception("密码长度不够")
# 2>主动抛出异常
raise ex
# 提示用户输入密码
try:
print(input_password())
except Exception as result:
print(result)
最后
我们这的新冠患者今天清零了,相信隔离的日子马上就要结束了,加油!