文章目录

  • 一、异常处理(你不可能总是对的)
  • 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、异常处理办法

python logging报错 python logging exception_python logging报错

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