# 这是学习廖雪峰老师python教程的学习笔记

1、概览

我们在运行程序或编写函数时,发生错误后,系统都会返回错误信息。我们可以通过某些机制,让错误信息更加明了

1.1、try

try机制的格式就是 try…except…finally。

try:   # try: 运行这段代码,若代码有误,就执行except

print('try...')

r = 10 / 0

print('result:', r)

except ZeroDivisionError as e:  # except:捕获指定的错误类型并赋值给变量e。except可以有多个

print('except:', e)

finally:  # try 或 except 执行完后,执行finally

print('finally...')

注意:

Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”。比如:

try:
    foo()
except ValueError as e:
    print('ValueError')
except UnicodeError as e:
    print('UnicodeError')

第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类,如果有,也被第一个except给捕获了。

1.2、调用栈

$ python3 err.py

Traceback (most recent call last):

File "err.py", line 11, in <module>

main()

File "err.py", line 9, in main

bar('0')

File "err.py", line 6, in bar

return foo(s) * 2

File "err.py", line 3, in foo

return 10 / int(s)

ZeroDivisionError: division by zero

调用栈就是系统自己返回的错误信息。看调用栈,从上往下看。最后三行指明了错误的根源

1.3、记录错误

如果不捕获错误,可以让Python解释器来打印出错误堆栈,但程序也被结束了。

我们也可以捕获错误,把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。

Python内置的logging模块可以非常容易地记录错误信息。

import logging

def foo(s):

return 10 / int(s)  # 错误根源

def bar(s):

return foo(s) * 2

def main():

try:

bar('0')  # main()调用bar(),bar()调用foo()。

except Exception as e:

logging.exception(e)

main()

print('END')

因为有 logging.exception(e)。执行 .py文件后。会继续执行,打印出“END”

1.4、抛出错误

错误是class,捕获一个错误就是捕获到该class的一个实例。所以,错误并不是凭空产生的,而是有意创建并抛出的。抛出的错误既可以是Python的内置函数定义的,也可以是我们自己定义的

1、第一种抛出:

# err_raise.py

class FooError(ValueError):  # 定义了一个错误类

pass

def foo(s):

n = int(s)

if n==0:

raise FooError('invalid value: %s' % s)  # 抛出自己定义的错误类

return 10 / n

foo('0') # 调用函数

2、第二种抛出:

# err_reraise.py

def foo(s):

n = int(s)

if n==0:

raise ValueError('invalid value: %s' % s)  # 抛出ValueError错误

return 10 / n

def bar():

try:

foo('0')

except ValueError as e:  # 捕捉错误

print('ValueError!')

raise # raise不带参数,把当前错误原样抛出。因为调用了foo(),所以抛给foo()

bar() # 调用函数

ValueError!  # except捕获错误后的print

Traceback (most recent call last):   #原样抛出错误,表现形式为协议栈

File "<stdin>", line 1, in <module>

File "<stdin>", line 3, in bar

File "<stdin>", line 4, in foo

ValueError: invalid value: 0   # foo()抛出捕获的错误

1.5、错误的转换

在except中raise一个Error,可以把一种类型的错误转化成另一种类型

try:

10 / 0

except ZeroDivisionError:

raise ValueError('input error!')

转载于:https://blog.51cto.com/12758568/2116869

Python学习笔记__8章错误、调试和测试__8.1章错误处理相关推荐

  1. Python学习笔记Day 3

    Python学习笔记 Day 3 集合(关系测试.去重) 集合定义 关系测试-交集(&),并集(|),差集(-),子集,父集,对称差集(^) 增删查 增 .set.add(),.set.upd ...

  2. 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符

    Python学习笔记之[第一章]基础知识 前言: 一.格式化输出 1.基本格式: 2.练习代码: 二.转义字符 1.基本格式: 2.练习代码: 3.输出结果: 三.输入 1.基本格式: 2.练习代码: ...

  3. 【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化

    第四章 欢迎访问我搞事情的[知乎账号]:Coffee 以及我的[B站漫威剪辑账号]:VideosMan 若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦. #编译器使用的是sypder,其中&q ...

  4. Python学习笔记:web开发1

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:网络编程

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. Python学习笔记:常用第三方模块3

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. Python学习笔记:常用第三方模块(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. OpenCV之Python学习笔记

    RSS订阅 登陆 注册 原文链接地址:http://www.itozi.net/19477.html OpenCV之Python学习笔记 ITOZI 发布于 2015-08-06 分类:OpenSta ...

  9. Python学习笔记:第十站 水晶球不调用不动

    Python学习笔记 文章目录 Python学习笔记 第十站 水晶球不调用不动 1. 函数的创建和调用 2. 函数的参数传递 3. 函数的返回值 4. 函数的参数定义 5. 变量的作用域 6. 递归函 ...

  10. Python学习笔记:第四站 往哪走

    Python学习笔记 文章目录 Python学习笔记 第四站 往哪走 1. 程序的组织结构 2. 顺序结构 3. 对象的布尔值 4. 分支结构 5. pass空语句 6. 本章作业 课程笔记参考B站视 ...

最新文章

  1. 机器人流程自动化(RPA)系统原理及特点
  2. VMware 虚拟机
  3. 生产性服务业的源起及内涵(制造服务业的前世今生之一)
  4. 用Visual C#来清空回收站(1)
  5. 如何用计算机弹逆战6,逆战星光弹夹使用方法介绍 轻松玩转星光弹
  6. arm处理器的历史及现状
  7. 分享自己写的一个贪吃蛇的游戏(Linux)
  8. 12家无人驾驶公司新进展:驾照怕白考了!
  9. nginx配置和前端跨域问题
  10. 相机技术公司Lytro获6000万美元D轮融资,阿里巴巴参投
  11. java获取路径中的文件名_3种Java从文件路径中获取文件名的方法
  12. 高中数学解析几何求轨迹常用的六种解题方法(实用干货)
  13. VS2010对话框中使用MSChart控件
  14. 概率论 计算机论文,《概率论与数理统计》毕业论文
  15. 混音师的混音之道|处理母带和混音的差别?母带处理的真相(上)|MZD Studios
  16. WordPress插件大合集会员收费下载/美化/卡密批量生成/积分功能 ErphpDown 包含9.42~~9.83版本
  17. 【NOI Online】 2021普及
  18. 【转载】【常见缺陷分析技术】基于ODC的软件缺陷度量研究
  19. Linux全套完整视频教程
  20. 数据系统架构-6.BI数据展示平台

热门文章

  1. MyBatis中传递数组参数和List参数时if-test判空和判断长度的写法
  2. C#中怎样将数组的顺序打乱随机排序
  3. Java中获取数据库中两个时间的相差秒数
  4. Vue实现仿音乐播放器4-Vue-router实现音乐导航菜单切换
  5. Python实现最简单的文字游戏
  6. erp二次开发有出路吗_ERP的真正技术瓶颈:详细生产排程!
  7. swoole mysql 并发_Swoole4 如何打造高并发的PHP7协程Mysql连接池?
  8. laravel翻看php日志,关于Laravel的日志用法
  9. Quarkus 0.12.0 发布,下一代 K8s 原生 Java 框架
  10. IC攻城狮求职宝典 01 2018年IC设计企业 笔试题 01 英伟达(Nvidia)