文章目录
- 一、异常处理(你不可能总是对的)
- 1.1、异常处理机制的重要性
- 1.2、常见异常
- 1.3、异常处理办法
- 1.4、assert(断言)
- 1.5、raise(抛出异常)
- 1.6、自定义异常
- 二、pdb 调试
- 2.1、调试步骤
- 2.2、pdb 命令详解
- 三、参考资料
一、异常处理(你不可能总是对的)
1.1、异常处理机制的重要性
- 当发生异常时我们需要捕获处理它,否则程序会终止执行
- 为了增强程序的健壮性和用户体验,尽可能的捕获所有预知的异常并写好处理的代码,当异常出现的时候,程序自动消化并恢复正常(不至于崩溃)
1.2、常见异常
- BaseException:所有异常的基类
- Exception:常规错误的基类
- Warning:警告的基类
- DeprecationWarning:关于被弃用的特征的警告
- AssertionError:断言语句失败
- AttributeError:尝试访问未知的对象属性
- ImportError:导入模块失败
- OSError:操作系统产生的异常
- SyntaxError:语法错误
- TypeError:不同类型间的无效操作
- ValueError:传入无效的参数
- IOError:输入/输出异常;基本上是无法打开文件
- NotImplementedError:尚未实现的方法
1.3、异常处理办法
try: # 当我们认为某些代码可能会出错时。若执行出错,
检测范围 # 则后续代码不会继续执行,而是直接跳至错误处理代码,即 except 语句
except Exception(上面的常见异常) as e: # 当无法预知会发生哪些异常,可以去掉括号及其中内容去捕获异常原因 e
# 出现异常后的处理代码(pass:不处理)
print('出错啦! \n 错误的原因是:' + str(e))
print('出错图片的路径:', img_path)
wrong_cnt += 1
continue # 进入下一次循环
else:
没有异常时执行的代码
finally:
无论如何都会被执行的代码(通常是为了实现不得不执行的收尾工作,比如在程序崩溃前保存用户文档)
1.4、assert(断言)
- 断言用于判断一个表达式,在表达式条件为
False
的时候触发异常 - 断言可以在条件不满足程序运行的情况下
直接返回错误
,可用于程序的内部自检调试 - 注意点:
- 坑 1:设置解释器可以全局禁用断言,所以不要用断言来验证数据
- 坑 2:assert 后面不要用元组,因为在 python 中非空元组总为
Ture
,这样 assert 就永远不会触发异常
语法:assert expression [, arguments]
# example 1:
x = 3
assert 10 < x < 19, 'value is invalid'
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-3-d25a934fd887> in <module>()
----> 1 assert 10 < x < 19, 'value is invalid'
# example 2:
assert (10 < x < 19, 'value is invalid')
---------------------------------------------------------------------------
<ipython-input-4-6604e34d8a5b>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
assert (10 < x < 19, 'value is invalid')
assert 0 < x < 9, 'value is invalid'
>>> 正常执行
1.5、raise(抛出异常)
# 语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
# 最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象
raise [Exception [, args [, traceback]]] # eg:raise NotImplementedError("Not Implemented")
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
>>> try:
raise NameError('HiThere') # 模拟一个异常。
except NameError:
print('An exception flew by!')
raise
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
1.6、自定义异常
# 异常类继承自 Exception 类,可以直接继承,或者间接继承
>>> class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
>>> try:
raise MyError(2*2)
except MyError as e:
print('My exception occurred, value:', e.value)
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'
二、pdb 调试
2.1、调试步骤
# 在需要调试的文件中:import pdb
import pdb
# 在可能出错的地方设置断点:pdb.set_trace()
pdb.set_trace()
2.2、pdb 命令详解
# 只需输入括号中的命令即可
list(l):查看当前代码段
next(n):单步调试,不进入函数内部(step over)
step(s):进入函数内部(step into)
查看变量的值:p 变量名/大多数情况可以直接输入变量名查看/查看多个变量用逗号隔开即可
动态设置断点:b+需要设置断点的行号/单打一个b:查看所有的断点编号/cl 编号:清除编号处断点/cl:清除所有断点
return(r):执行代码直到从当前函数返回
continue(c):继续执行程序
jump(j):j+行号,让程序跳转到指定行号
args(a):打印当前函数的实参值
quit(q):终止并退出
三、参考资料
1、https://www.runoob.com/python/python-exceptions.html2、https://www.runoob.com/python3/python3-errors-execptions.html