心情有点纠结,怎么说呢,倒不是因为其他学习上的事情,反而是因为生活上狗血的剧情逼着人偏离,渐行渐远,人跟人之间有误会也是正常的,可能是因为交流不够,彼此不够了解吧,希望能尽快度过这一段纠结的日子,简单的生活,慢慢的品味,细细的思考。

最近一段时间,因为需要,借阅了一本Python Cookbook,发现这本书在很多方面介绍的都很不错,比如一些系统管理,web,分布式编程,数据持久化等等这些方面。但是却没有发现详细的关于错误和异常的一些介绍,本着作死的态度打算好好研究一下。

首先,照例,我们先来看一段示例程序:

首先,我们这里出现的不是异常,而是另一个我们经常遇到的非致命警告warning,主要是向用户提供非致命警告,指出运行一个程序时遇到的问题,通常来说,我们最好是在程序中不要出现这些东西,否则我们就需要从新审视我们的代码了。

一.Warning---非致命警告

警告使用的是内置异常类Warning的子类进行分类,通常需要根据过滤器(filter)设置来处理。过滤器一般包括,Action,Message,Category,Module和Line number.也可以这么理解,这里面的消息Message部分通常是一个匹配警告文本的正则表达式,类别Catregory是一个异常类的名称,模块Module包含一个正则表达式,要与生成警告的模块名匹配,行号Line Number可以改变在一个警告出现时的处理

每当生成一个警告时,都需要将其与注册过的过滤器比较,第一个匹配的过滤器将控制这个警告采取的动作,否则采取默认的动作,其实本质流程上会发现与Exception异常处理如出一辙,看一下常见的过滤器动作:

动作

含义

error

将警告提升为异常

ignore

忽略警告

always

总是抛出警告

default

从各个位置第一次生成警告时输出警告

module

从各个模块第一次生成警告时输出警告

once

第一次生成警告时输出警告

1.模式过滤

简单的过滤如示例中的show_warning_by_filtering(),但是想要通过编程按照更复杂的规则进行过滤就需要使用filterwarning(),比如,需要根据消息文本的内容过滤,可以提供一个正则表达式作为参事。如示例中的show_pattern_filter(),模式包含‘do not’具体的消息中使用了‘Do not’,正则表达式被编译为不区分大小写的匹配,故这个模式会匹配。当然,同样的匹配也适用于源模块名,可以将模块名作为模式传至module参数,抑制来自copy模块的所有消息,如下所示:

当然,我们也可以限定只抑制某一行上的警告,如下所示:

2.重复警告

默认情况,大多数警告只会在给定位置第一次出现时才会输出,但是假如我们的程序里面出现了警告,我们改完之后发现后面还有一个相同的警告,这个时候就会有不知道什么时候是个头的错觉,最直接的办法就是在每一个出现警告的地方我们就给他来一个警告,最起码我们能做到心里有数,如下所示:

3.警告定向输出

一般情况下,警告都会输出到sys.stderr,我们可以通过替换warning模块中的showwarning()函数来改变这个行为,如下所示:

稍微注意下:这里的UserWarning是一种警告类型,来自用户代码的警告的基类,还有一些其他的类型,比如:

Warning-----所有警告的基类

DeprecationWarning----用于不再维护的特性

PendingDeprecationWarning----用于很快会废弃的特性

SyntaxWarning---用于有问题的语法

RuntimeWarning----用于运行时可能导致问题的事件

FutureWarning----关于将来语言或者库中可能的改变的有关警告

ImportWarning  关于导入模块时出现的问题的警告

UnicodeWarning---关于Unicode文本中的问题的警告

二.Exception----内置异常类

1.异常基类

BaseException:

所有异常的基类,实现了基类的逻辑,可以使用str()由传入构造函数的参数创建异常的一个串表示

Exception:

有些异常不会导致退出正在运行的应用,Exception是这些所有异常的基类,用户定义的所有异常应当都是用其作为基类

StandardError:

标准库中使用的内置异常的基类

ArithmeticError:

与数学相关的错误的基类

LookupError:

无法找到某个对象时产生的错误的基类

EnvironmentError:

来自Python外部(操作系统,文件系统等)错误的基类

2.常见的异常

这里,我们仅仅以AssertionError为例,AssertionError是由一个失败的assert语句产生,断言在库中一般很常见,通常用来对传入参数的限制,通过类似failif()等方法,AssertionError还可以用在unittest模块创建的自动测试中,运行的自动测试套件的程序会监视AssertionError异常,作为测试失败的一个特殊提示,如下所示:

当然除此之外还有很多异常,如下:

AttributeError:当一个属性引用或赋值失败时,会产生

EOFError:对于类似input或者raw_input这样的内置函数,如果在遇到输入流末尾之前没有读到任何数据,会产生

FloatingPointError:这个错误由导致错误的浮点操作产生,前提是已经打开了浮点异常控制(fpectl),启用fpectl时,要求编译解释器提供 with-fpectl标志,但是标准文档中不提倡使用fpectl

IOError:输入或输出失败时会产生,如磁盘满了,输入文件不存在等等

ImportError:无法导入一个模块或者模块中的一个成员时会产生该异常

IndexError:如果一个序列引用越界,就会产生IndexError

KeyError:如果没有找到一个值作为字典的键,会产生异常

KeyBoardInterrupt:用户按下Ctrl-C(或者Delete)终止一个正在运行的程序时,会产生

MemoryError:如果一个程序用尽了所有内存,而且可以恢复,会产生

NameError:如果代码引用了一个名字,而当前作用域中不存在这个名字,会产生

NotImplementedError:用户自定义的基类可能产生NotImplementedError,来指示一个方法或者行为需要子类定义

OSError:一个操作系统级别函数返回错误时会产生OSError

OverflowError:当一个算术运算超出变量类型的界限时,会产生

RefernceError:

使用一个weakref代理访问已经被垃圾回收的对象时,会产生

RuntimeError:如果没有其他更特定的异常可用,就要使用RuntimeError异常

SyntaxError:当解释器无法解释程序的时候,会产生

SystemError:如果错误发生在解释其本身,会产生

SystemExit:当调用sys.exit()会产生

TypeError:结合对象或者在对象上调用函数时,如果对象类型不正确会产生

UnboundLocalError:一种NameError,特别针对局部变量名

UnicodeError:ValueError的一个子类,出现Unicode问题时产生

ValueError:如果一个函数接收到的值类型正确,但是值不合法

ZeroDivisionError:0做分母时抛出

特别提醒:关于为什么要了解异常呢,首先在程序中我们可能会经常碰到,但是最重要的是这对以后我们编写程序,调试程序提供了有力的帮助,针对错误信息,可以立即判断出什么地方出了问题,这才是最重要的地方

转载于:https://www.cnblogs.com/ainima/p/6331117.html

python进阶八_警告和异常相关推荐

  1. python进阶数据分析_数据分析--Part 2: Python进阶

    笔记内容来源:拉勾教育数据分析实战训练营 本篇是Part 2,python的进阶部分开始啦~~~~~~~ 说明:理论部分是提炼的老师所讲,加上我自己看书添加的一些解释,代码部分有些会融合老师和我自己练 ...

  2. Python爬虫(八)_正则表达式

    什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一 ...

  3. python进阶项目设计_推荐系统进阶:设计和构建推荐系统流程综述(1)

    内容目录推荐系统应用场景概述 为什么需要推荐? 推荐系统的目标? 推荐系统的工作? 推荐系统的基本模型 构建推荐系统的方法 相关参考? 1.推荐系统概述以及它们如何提供有效形式的定向营销 推荐系统 推 ...

  4. 【python进阶】_文件和目录操作

    创建目录 os.makedirs 可以递归的创建目录结构,比如 import os os.makedirs('tmp/python/fileop',exist_ok=True) 会在当前工作目录下面创 ...

  5. 【python进阶】_装饰器

    装饰器本身是一个函数. 需求:在下面返回时间的函数前面都在开头加上:当地时间 import time def getXXXTime():print()return time.strftime('%Y_ ...

  6. 【python进阶】_多线程多进程

    进程就是运行着的程序 线程就是操作系统创建的,每个线程对应一个代码执行的数据结构,保存了代码执行过程中的重要的状态信息.系统中每个进程里面至少包含一个线程.没有线程,操作系统没法管理和维护代码运行的状 ...

  7. python进阶九_网络编程

    Python网络编程一 一.一些基本概念 在Python网络编程这一节中会涉及到很多网络相关的术语,对于一些最基本的概念,如TCP/IP,Socket等等不再赘述,不明白的可以自己去查一查,对于一些常 ...

  8. python 进阶知识点_高效率 Python 进阶:10 个关键知识点与特性

    作为一个语法非常简洁.自由的动态语言,Python 在编程语言行列中这些年的发展无疑是个成功的典范.它因在 Web 开发.数据科学.AI 算法等方向的广泛使用而为人熟知. 再宏大的"软件大厦 ...

  9. python主动抛出异常_主动抛异常

    主动抛异常 1. 抛异常 有时,程序需要主动抛出异常,因为某些情况下,你需要反馈消息给更上层的调用者,告诉它有一些异常情况发生,而你抛出异常的地方,没有能力处理它,因此需要向上抛出异常. 这种情况为什 ...

最新文章

  1. 多年没有管理的技术博客了,即日起开始管理起技术博客
  2. CNN加速器设计新突破,逼近能效理论极限
  3. 使用Eclipse+PyDev+EclipseHtmlEditor搭建Django开发环境
  4. 【原创】TimeSten安装与配置
  5. 合并两个有序链表(C++)
  6. Java:异常的概念及分类、异常的处理、异常抛出及自定义异常
  7. 【Linux】14.ubuntu忘记root密码、用户密码输入次数过多锁住的问题
  8. Matlab中特征选择reliefF算法使用方法(分类与回归)
  9. Qt QML模块提供的重要C ++类
  10. 【拔刀吧少年】之Expect 自动化控制和测试 Here Document 免交互
  11. 本地windows下新建kafka生产消费数据
  12. 用SAI的时候笔会自动取色,画个草稿都画不下去怎么办
  13. 图片清晰度差怎么修复成高清图片
  14. 有各组方差怎么算组间平方和_方差分析:组间离差平方和组内离差平方的定义是什么?...
  15. 才发现Nero8出现了问题
  16. 【每日英文】2021.9.23
  17. Centos 默认网关GATEWAY不生效
  18. 经典光流估计算法和光流对齐方法
  19. 怎样才能掌握好计算机知识,简析怎样才能上好计算机课
  20. 【CICE-A7a】人身保险会计与财务(上)

热门文章

  1. QQ聊天文字背影图片拉伸方法
  2. stm32上的Lava虚拟机开发进度汇报(3)
  3. UVA 10706 Number Sequence
  4. 一个WCF RESTSOAP Post例子
  5. sqlite3 外键支持
  6. Linux NB的单行命令
  7. Docker 容器从入门到Devops实践
  8. java 从数据库取值_JAVA操作数据库--从一张表中取值,经过判断,然后插入另一张表中。...
  9. linux解决windows应用程序,关于Linux下使用Windows应用程序的尝试总结
  10. CTF基础理论知识02