异常处理
一、基础知识
1.1 什么异常
异常指的是软件在运行的过程中,因为一些原因(如:使用者操作不当等),引起程序错误,导致软件奔溃的这种现象
1.2 为什么要处理异常
提高软件容错性。代码就能够继续向后执行,而不会奔溃。
二、异常处理
2.1 常见的异常
• ValueError
• KeyError
• KeyboardInterrupt
• ArithmeticError
• FloatingPointError
• IndexError
• SyntaxError
• …
2.2 异常的继承关系
BaseException 所有异常的超类 |
Exception(BaseException) 常规错误的异常超类 |
ValueError、KeyError、KeyboardInterrupt、ArithmeticError…等常见类均继承Exception类 |
2.3 异常处理
2.3.1 try…except语句
try……except语句:将可能出现异常的代码段放在try语句块,遇到异常程序不终止报错,跳转到except语句块中。
try:
# 将有可能触发异常的代码
except:
print("处理异常")
- 简单应用:处理通用异常
# 如果代码中可能会出现异常,可以使用try来尝试着抓捕异常
try:
# 将有可能触发异常的代码写下try中
num = int(input("请输入一个数字:"))
result = num + 10
except: #当出现异常时,跳转此处
print("出现异常!")
"""
结果:
请输入一个数字:s #s不是整型
出现异常!
"""
- 可以通过指定异常类构建对象,输出异常信息:
# 如果代码中可能会出现异常,可以使用try来尝试着抓捕异常
try:
# 将有可能触发异常的代码写下try中
num = int(input("请输入一个数字:"))
result = num + 10
except Exception as e: #当出现异常时,跳转此处
print("出现异常!异常信息是:", e)
"""
结果:
请输入一个数字:w
出现异常!异常信息是: invalid literal for int() with base 10: 'w'
"""
2.3.2 多个异常的处理
#方法一:
try:
pass
except KeyboardInterrupt:
pass
except BlockingIOError:
pass
except EOFError:
pass
except Exception:
pass
#方法二(不推荐使用)
try:
pass
except (KeyboardInterrupt, KeyError, ValueError, EnvironmentError) as e:
print("出现了异常")
实例:
# 如果代码中可能会出现异常,可以使用try来尝试着抓捕异常
try:
# 将有可能触发异常的代码写下try中
num = int(input("请输入一个数字:"))
result = num + 10
f = open("a.txt", "rt")
except ValueError as e:
print("出现异常!", e)
except FileExistsError:
print("出现异常!文件不存在")
"""
结果:
请输入一个数字:w
出现异常! invalid literal for int() with base 10: 'w'
————————————————————————————————————
请输入一个数字:15
出现异常!文件不存在
"""
- 可以使用多态性,将其他可能出现的异常处理掉
# 如果代码中可能会出现异常,可以使用try来尝试着抓捕异常
try:
# 将有可能触发异常的代码写下try中
num = int(input("请输入一个数字:"))
result = num + 10
# f = open("a.txt", "rt")
sasas
except ValueError:
print("出现数值型异常!")
except FileNotFoundError:
print("出现异常!文件不存在")
except BaseException as e:
print("出现其他异常,异常信息是:", e)
"""
结果:
请输入一个数字:1
出现其他异常,异常信息是: name 'sasas' is not defined
"""
2.3.3 else
try:
# 将有可能触发异常的代码写下try中
num = int(input("请输入一个数字:"))
result = num + 10
# f = open("a.txt", "rt")
except ValueError:
print("出现数值型异常!")
except FileNotFoundError:
print("出现异常!文件不存在")
except BaseException as e:
print("出现其他异常,异常信息是:", e)
else:
# try语句块中没有任何异常,执行此语句块
print("没有异常!")
"""
结果:
请输入一个数字:12
没有异常!
"""
2.3.4 finally关键字
不论有没有异常,finally语句块都要执行。
一般会将必须要执行的代码,如资源的释放,链接的是关闭等等放入finally语句块
try:
int(input("请输入一个数:"))
except Exception as e:
print("出现了异常")
else:
print("没有出现异常")
finally:
print("不管出不出现异常,我都要执行")
# 一般会将必须要执行的代码,如资源的释放,链接的是关闭等等
print("剩余的代码")
"""
结果:
请输入一个数:1
没有出现异常
不管出不出现异常,我都要执行
剩余的代码
————————————————
请输入一个数:w
出现了异常
不管出不出现异常,我都要执行
剩余的代码
"""
- 函数中:如果在return后面存在finally,那么代码并不会直接返回,而是需要先执行finally代码,之后才会返回
#对比1
def demo(msg):
try:
int(msg)
return "a"
except Exception as e:
print("处理异常")
return "b"
finally:
print("释放资源")
return "C"
return "D"
res = demo(input(">>>:"))
print(res)
"""
结果:
>>>:1
释放资源
C
————————————————————
>>>:w
处理异常
释放资源
C
"""
#对比2
def demo(msg):
try:
int(msg)
return "a"
except Exception as e:
print("处理异常")
return "b"
finally:
print("释放资源")
# return "C"
return "D"
res = demo(input(">>>:"))
print(res)
"""
结果:
>>>:1
释放资源
a
————————
>>>:w
处理异常
释放资源
b
"""
三、自定义异常
- 首先需要定义一个类,之后让这个类继承Exception\BaseException,建议使用Exception类。
- 人为的抛出异常:raise关键字。作用:提示错误,向上层传递错误信息
class MyException(Exception):
def __init__(self, msg):
Exception.__init__(self, msg)
def login(username, password):
if username is None or username.strip() == "":
# 抛出异常,使用raise关键字抛出异常
# 认为的抛出异常,1、这儿出了错, 2、向调用者传递信息
raise MyException("对不起,用户名称不能为空")
if password is None or password.strip() == "":
raise Exception("对不起,用户密码不能为空")
print("登录成功")
if __name__ == '__main__':
try:
login(input(">>"), input(">>"))
except Exception as e:
print("抓捕到异常,信息是--->", e)
"""
结果:
>>
>>1
抓捕到异常,信息是---> 对不起,用户名称不能为空
————————————————————
>>1
>>
抓捕到异常,信息是---> 对不起,用户密码不能为空
"""