文章目录(PS:觉得不错请点赞收藏支持一下)
一、异常基础
1.1 错误
在敲写代码过程中,相信很多人都碰过壁,因为总是要出错的嘛,出现错误不要急躁,一步一步去调试,当你解决了这个问题,你会发现快乐加倍。
- 错误分为两种
- 语法错误
- 异常
- 语法错误
while True
print('hello')
# 报错信息: SyntaxError: invalid syntax
!!意思是无效语法!!
不过现在的编辑器做的都很好,语法错误都会给出提示,能更好的避免这些问题。
- 异常
- 概述:代码编写阶段没有问题,代码运行阶段出现了错误,Python 解释器会抛出异常错误信息。
- 举例:
res = open('aa.txt','r')
print(res.read())
# 报错信息: FileNotFoundError: [Errno 2] No such file or directory: 'aa.txt'
什么意思呢? 大概意思就是当前目录没有此文件
1.2 处理异常
想一想,我们应该需要做什么呢?
如果想对异常进行处理,需要:
1. 让异常信息不要显示在页面上
2. 能够获取异常信息,然后针对性的进行处理,如写入日志文件等
那我们该如何操作呢?别急,Python 编程语言呢有内置的方法,我来教你
如何获取异常信息?
使用 try...except 组合进行处理
1. 将可能发生异常的代码放到 try 中
2. 使用 except 捕获异常: 意思就是 try 中的代码一旦出错,就自动跳转到 except 中;
如果 try 中的代码没有发生错误,则不执行 except 中的代码
# 语法
try:
代码
except 异常类型:
代码
方法告诉你了,让我们来动手写一写
try:
res = open('aa.txt', 'r')
except:
print('出错了')
# 运行结果: 出错了
是不是控制台没有出现红色的信息,感觉很舒适了一些~
二、捕获异常
2.1 内置异常类型
不给大家一个一个举例子了,直接看图,这些是我总结的一些比较常见的异常类型,眼熟它即可,因为时间很长,你要与它陪伴很久很久~
ZeroDivisionError 除零错误
TypeError 类型错误
AttributeError 属性错误
NameError 变量名错误
SyntaxError 语法错误
KeyError 字典键名错误
IndexError 索引错误
IndentationError 缩进错误
TabError 空格和Tab混用
OSError 系统错误
ValueError 传入无效的参数
2.2 捕获指定异常
慢下来,思考一下,Python 开发者为什么要内置异常类型呢?
# 为什么要内置异常类型
如果仅仅使用 try...except 虽然可以捕获异常,但是无法知道具体的异常信息,非常不利于后面处理错误,在 except 后面加上异常类型,就可以捕获到指定的异常信息
举一个变量类型异常的例子吧
try:
print(number)
except NameError:
print('没有定义变量')
# 运行结果: 没有定义变量
咱们这里只是举个简单的例子方便大家理解,在编辑器敲写时,number 变量就已经标注红色了
2.3 捕获多个指定异常
虽然捕获了指定的异常,但是却无法捕获其他的异常,怎么办? Python 开发者前辈早已开发好了方法供我们使用
try:
print(number)
except (ZeroDivisionError,FileNotFoundError,NameError):
print('发生错误')
# 运行结果: 发生错误
2.4 捕获所有异常
看到标题是不是在想,wcnb,多么的人性化,学了之后是真的快乐加倍
try:
print(number)
except Exception:
print('发生了错误')
# 运行结果: 发生了错误
2.5 捕获异常描述信息
上述案例,无论是哪种错误,最后输出的结果都是自己先写好的,那可不可以获取不同异常的错误信息呢? 答案是可以的,Python 【yyds】
1. 语法
#
try:
代码
except 异常类型 as xx:
代码
2. 举例
# 例1
try:
print(number)
# as 声明后面的变量名,变量名可以随意命名,意思就是将 Exception 捕获的异常错误信息赋值给了 result, 然后 print 输出就可以了
except Exception as result:
print(result)
# 运行结果: name 'number' is not defined
# 例2
try:
print(10 / 0)
except Exception as result:
print(result)
# 运行结果: division by zero
2.6 异常的 else方法 和 finally 方法
相信 else 方法大家都不陌生,条件判断语句 if esle 写了太多次了,几乎离不开它,那它的作用在异常里面又是怎样的呢?
1. 结构
try:
可能发生错误的代码
except:
如果出现异常执行的代码
else:
没有出现异常要执行的代码
finally:
无论是否出现异常都要执行的代码
2. 举例
try:
print('hello')
except Exception as result:
print(result)
else:
print('代码正常执行')
finally:
print('我每次都要执行')
三、异常嵌套
嵌套这个词,几乎前面每次讲一个知识,都会有嵌套,比如: if嵌套语句,for 循环嵌套语句,while循环嵌套语句,列表嵌套,字典嵌套…等等,异常也如它们一样。
# 例1
"""
首先让用户输入年龄,正常的话则继续让用户输入身高,不正常则捕获异常,这个举例有些勉强,为了简单的向大家介绍 异常嵌套,就先这样吧,往后当你工作时,你会常用到的。
"""
try:
age = int(input('输入年龄:'))
try:
height = int(input('输入身高(cm):'))
except:
print('身高输入有误')
else:
print(f'年龄:{age},身高:{height}')
except:
print('年龄必须是数字')
四、自定义异常
如何使用?
- 创建自定义异常类,继承 Exception
- 重写
__str__
方法,返回错误描述信息 - 使用 raise 抛出自定义异常
1. 语法
raise 异常类对象
2. 举例
class ShorInputError(Exception):
def __str__(self):
# 返回 如果密码长度 < 3 时要向用户展示错误信息
return f'密码长度不能小于3'
try:
password = input('输入密码:')
if len(password) < 3:
"""
raise 后面跟一个异常类型的实例,用于抛出此类型的异常,好让 except 捕获异常
也就是说,将代码的控制权移交给 except
"""
raise ShorInputError()
except Exception as result:
# result 就是自定义异常类中 str 方法返回的错误信息
print(result)