异常即一个事件,该事件会在程序运行中执行,如果程序遇到异常而没有及时捕获该异常程序就会抛出错误,也就是报错。
而异常处理可以让我们的代码更加的健壮,简单说就是:异常是错误出现时,可以在正常的控制流程以外采取的行为。
语法
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('登录成功!')