异常即一个事件,该事件会在程序运行中执行,如果程序遇到异常而没有及时捕获该异常程序就会抛出错误,也就是报错。
而异常处理可以让我们的代码更加的健壮,简单说就是:异常是错误出现时,可以在正常的控制流程以外采取的行为。
语法
try: 执行正常代码 except[异常类型可选]: 执行异常代码
异常示例
num = int(input('Please enter a number:'))
if num < 18:
print("I'm sorry, you're underage!")
else:
print("Congratulations, you've come of age!")
对于这个程序而已,如果输入一个非整数数字那将会抛出字符无效的异常,假设输入abc将会得到以下异常;
异常信息: ValueError: invalid literal for int() with base 10: ‘aba’
ValueError:异常类型,Python有很多内置的异常类可在标准库中查找;
异常处理
下面我们改善一下它,让它变得更加的健壮!
# 一 不打印报错信息
"""
try:
num = int(input('Please enter a number:'))
if num < 18:
print("I'm sorry, you're underage!")
else:
print("Congratulations, you've come of age!")
except:
# 程序发送异常时执行
print("Please input properly!")
"""
# 二 打印异常信息
# 注意,这里我添加了异常检测类型
# 如果程序比较复杂推荐打印异常信息,然后写入日志。
try:
num = int(input('Please enter a number:'))
if num < 18:
print("I'm sorry, you're underage!")
else:
print("Congratulations, you've come of age!")
except ValueError as error:
# 程序发送异常时执行
print('异常信息:', error)
你可以注意到了就是 try-except 多加了一个 else ,不错不过这个 else 大有用处!
语法
try:
执行正常代码(检测与捕获)
except:
执行异常代码
else:
执行正常代码(无异常正常处理)
示例
try:
num = int(input('Please enter a number:'))
except ValueError as error:
print('异常信息:', error)
else:
if num < 18:
print("I'm sorry, you're underage!")
else:
print("Congratulations, you've come of age!")
这样做的好处是只需要检测会出现异常的代码块,减少代码的冗余,让程序的可读性更佳!
语法
try:
执行正常代码
except[异常类型可选]:
执行异常代码
finally:
不管是不是异常都会执行
示例
try:
file = open('new.txt', 'w')
content = 'Hello, Python'
file.write(content)
except:
print('在进行文件操作时,遇到了异常!')
finally:
file.close()
这里我打开了一个文件,并往里面写入内容,但当程序出现异常时我希望把打开的文件释放掉这时可以用 finally 。
废话少说,直接上代码
try:
age = int(input('请输入你的年龄:'))
x = 10 / age
print(x)
# 如果捕获了该异常,则边的异常不再捕获
except ValueError:
print('别闹, 快输入整数!')
#0 是不能被作为除数的,所以我们也需要捕获该异常
except ZeroDivisionError:
print('请输入合理的年龄!')
简化型
try:
age = int(input('请输入你的年龄:'))
x = 10 / age
print(x)
# 多个异常类型捕获需使用元组将其包括
except (ValueError, ZeroDivisionError):
print('请输入一个合理的年龄!')
示例
age = int(input('请输入一个年龄:'))
if age < 18:
raise ValueError('你还没成年!')
print('Continue')
注意: 主动抛出异常语句慎用
# 自定义异常
class ValidateError(ValueError):
def __init__(self, userdata):
super().__init__(userdata)
# 登录验证
def login(user, password):
if user == '' or password == '':
raise ValidateError('账号密码不能为空!')
if user != 'andy' or password != '123456':
raise ValidateError('账号密码不正确!')
user = input('请输入你的用户名:')
password = input('请输入你的密码:')
try:
login(user, password)
except ValidateError as e:
print(e)
else:
print('登录成功!')