# -*- coding: utf-8 -*-
# @Time : 2019/11/19 16:24
# @Author : John
# @Email : 2398344557@qq.com
# @File : 异常处理.py
# @Software: PyCharm
作用:程序不会停止执行,而是提示出错误信息后继续执行剩下的内容
# 语法:
# try:
# 尝试执行的代码
# except:
# 出现错误的处理
-
try...except
【例】简单异常捕获:要求用户输入整数
try:
# 提示用户输入一个数字
num = int(input('请输入数字:'))
except:
print('请输入正确的数字')
print('no problem')
# 分析:
# 当尝试输入数字1时,程序正常运行,输出数字1,然后输出'no problem'
# 当尝试输入非数字时,程序还是正常运行,但输入except中的'请输入正确的数字',而且程序没有终止,接着输出'no problem'
请输入数字:1
no problem
请输入数字:shit
请输入正确的数字
no problem
-
try...except...except...
# 语法:
# try:
# 尝试执行的代码
# except 错误类型1:
# 针对错误类型1,对应的代码
# except(错误类型2, 错误类型3):
# 针对错误类型2和3,对应的代码处理
# except Exception as result:
# print('未知错误%s' % result)
【例】简单异常捕获:要求用户输入整数,使用8除以用户输入的整数并输出
try:
num = int(input('请输入整数:'))
result = 8 / num
print(result)
except ValueError:
print('请输入正确的整数!')
except ZeroDivisionError:
print('被除数不能为0!')
请输入整数:1
8.0
请输入整数:0
被除数不能为0!
请输入整数:n
请输入正确的整数!
-
异常捕获完整版
# 语法:
# try:
# 尝试执行的代码
# except 错误类型1:
# 针对错误类型1,对应的代码
# except(错误类型2, 错误类型3):
# 针对错误类型2和3,对应的代码处理
# except Exception as result: # 捕获未知错误
# print('未知错误%s' % result) # 打印错误的信息
# else:
# 没有异常时才会执行的代码
# finally:
# 无论是否有异常,都会执行的代码
【例】简单异常捕获:要求用户输入整数,使用8除以用户输入的整数并输出
try:
num = int(input('请输入整数:'))
result = 8 / num
print(result)
except ValueError:
print('请输入正确的整数!')
except ZeroDivisionError:
print('被除数不能为0!')
except Exception as result:
print('未知错误%s' % result)
else:
print('正常执行')
finally:
print('执行完成,但是不保证正确。')
请输入整数:1
8.0
正常执行
执行完成,但是不保证正确。
请输入整数:0
被除数不能为0!
执行完成,但是不保证正确。
请输入整数:no
请输入正确的整数!
执行完成,但是不保证正确。
-
异常的传递
即当函数/方法执行出现异常,会将异常传递给函数/方法的调用一方;
如果传递到主程序仍未异常处理,程序才会被终止。
用法:在主函数中增加异常捕获,当在主函数中调用其他函数时,只要出现异常,都会传递到主函数的异常捕获中。这样可以省掉大量代码量,保证代码的整洁。
【例】定义函数demo1(),要求用户输入一个整数并返回;定义函数demo2()调用demo1(),在主程序中调用demo2()
def demo1():
return int(input('请输入一个整数:'))
def demo2():
return demo1()
try:
print(demo2())
except ValueError:
print('请输入正确的整数!')
except Exception as result:
print('未知错误%s' % result)
# 分析:
# 先执行try中的print(demo2())语句,调用demo2()函数
# 进入demo2函数内,找到return demo1(),调用demo1()函数
# 进入demo1函数内,找到return int(input('请输入一个整数:')),让用户输入一个整数并返回这个数给demo和demo2
# 如果输入的时正确的整数,则直接输出该数
# 否则,当这个字符串不能通过int转化成整形数据时,执行except ValueError语句,输出请输入正确整数。
请输入一个整数:1
1
请输入一个整数:yes
请输入正确的整数!
-
抛出(raise)异常
作用:主动抛出异常
【例】定义函数input_password(),提示用户输入密码,如果用户输入长度<8,抛出异常;如果用户输入长度>=8,返回输入的密码
input_password():
# 1. 提示用户输入密码
password = input('请输入密码:')
# 2. 判断密码长度,如果长度>=8,返回用户输入的密码
if len(password) >= 8:
return f'你的密码为{password}'
# 3. 长度不够时抛出异常
ex = Exception('密码长度不够!') # 创建异常对象,使用异常的错误信息字符串作为参数
raise ex # 抛出异常对象
# 捕获异常
try:
user_password = input_password()
print(user_password)
except Exception as res: # res就是ex
print('发现错误:%s' % res)
请输入密码:1234567
发现错误:密码长度不够!
请输入密码:abcdefgh
你的密码为abcdefgh
-
自定义异常类
常常需要继承异常父类Exception
class MyException(Exception): # 让MyExceeption类继承父类Exception
def __init__(self, name, age):
super(MyException, self).__init__()
self.name = name
self.age = age
try:
myex = MyException('雪碧', 22) # 实例化一个异常类,需要传参数
raise myex #
except MyException as result: # 捕获MyException类携带的信息
print(result.name, result.age)
except Exception as res: # 万能捕获,之前可能漏下的,这里的Exception可以保底
print(res)
雪碧 22
# 当实例化的时候只传入一个参数:myex = MyException(name='雪碧') 或 myex = MyException(age=18)
__init__() missing 1 required positional argument: 'age'
__init__() missing 1 required positional argument: 'name'
# 当实例化的时候不传入参数:myex = MyException()
__init__() missing 2 required positional arguments: 'name' and 'age'