异常
异常的概念
- 在程序运行过程中,如果python的解释器遇到一个错误,会停止程序的执行,并且提示一系列的异常信息,这就是异常
- 程序停止运行并显示错误信息,我们称之为:抛出(raise)异常
- 通过抛出、捕获、处理异常,可以提高程序的稳定性和健壮性
示例
input_s = int(input("输入整数:"))
- 输入字母 a
ValueError: invalid literal for int() with base 10: 'a'
捕获异常
案例1
try:
input_s = int(input("输入整数:"))
except:
print("输入异常,请重新输入")
print("-" * 50)
结果
输入整数:a
输入异常,请重新输入
--------------------------------------------------
- 在程序执行时,可能会遇到不同的类型的异常,针对不同的异常,应该做出不同的处理,所以需要捕获异常的类型
案例2
try:
input_s = int(input("输入整数:"))
except Exception as result:
print("输入异常,异常原因:%s,请重新输入" % result)
输入整数:a
输入异常,异常原因:invalid literal for int() with base 10: 'a',请重新输入
- 捕获异常的语法如下
try:
# 尝试执行的代码
pass
except 异常1:
# 针对异常1的处理
pass
except (异常2,异常3):
# 针对异常2,异常3的处理
pass
except Exception as result:
#针对未知异常的处理
pass
案例3
需求:
- 从键盘输入一个数
- 用8/这个数,针对键盘输出的不同内容做异常处理
try:
input_s = int(input("输入整数:"))
print(8 / input_s)
except ValueError as value_error:
print("输入值有误")
except ZeroDivisionError as zero_division_error:
print("除0错误")
except Exception as result:
print("输入异常,异常类型%s,异常信息%s,请重新输入" % (type(result), result))
print("-" * 50)
上述案例中,最后一个异常处理是捕获未知错误。
- 捕获未知错误
- 开发过程中不能完全预判所有错误
- 为了不在未知错误发生时,中止程序的运行。可以在捕获异常后,再增加一个 expect
except Exception as result:
print("未处理错误类型%s,未处理错误详情%s"%(type(result), result)))
异常捕获的完整语法
try:
pass
except:
pass
else:
# 没有异常才会执行的代码
finally:
# 无论是否出现错误,都会被执行的代码
- else 只有在没有异常时,才会执行的代码
- finally 无论是否有异常,都会执行的代码
案例4
try:
input_s = int(input("输入整数:"))
result = 8 / input_s
except ValueError as value_error:
print("输入值有误")
except ZeroDivisionError as zero_division_error:
print("除0错误")
except Exception as result:
print("输入异常,异常类型%s,异常信息%s,请重新输入" % (type(result), result))
else:
print(result)
finally:
print("-" * 50)
测试结果1
输入整数:1
8.0
--------------------------------------------------
测试结果2
输入整数:a
输入值有误
--------------------------------------------------
测试结果3
输入整数:0
除0错误
--------------------------------------------------
异常的传递性
- 异常的传递:当
函数/方法
执行出现错误的时候,会将异常传递给函数/方法
的调用方 - 如果传递到主程序,仍然没有异常处理,程序才会中止
def exception1():
print(int(input("请输入一个整数")))
def exception2():
exception1()
exception2()
运行结果:
请输入一个整数a
Traceback (most recent call last):
File "C:\Users\11\PycharmProjects\pythonProject\ExceptionRaise.py", line 9, in <module>
exception2()
File "C:\Users\11\PycharmProjects\pythonProject\ExceptionRaise.py", line 6, in exception2
exception1()
File "C:\Users\11\PycharmProjects\pythonProject\ExceptionRaise.py", line 2, in exception1
print(int(input("请输入一个整数")))
^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'a'
可以利用异常的传递性,在主程序捕获异常并做处理
主动抛出异常
- 在开发中,除了代码执行出错,python解释器抛出异常外
- 可以根据应用程序特有的业务主动抛出异常
校验用户输入密码的长度
def exception1():
pwd = input("请输入密码")
if len(pwd) < 8:
raise Exception("初始化密码失败,密码不能少于8位")
try:
exception1()
except Exception as res:
print("输入异常,异常类型%s,异常信息%s,请重新输入" % (type(res), res))
请输入密码1
输入异常,异常类型<class 'BaseException'>,异常信息初始化密码失败,密码不能少于8位,请重新输入
- 将异常信息作为初始化参数并创建异常对象
- 使用raise 语句抛出异常