python进阶八_警告和异常


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

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

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

\

首先,我们这里出现的不是异常,而是另一个我们经常遇到的非致命警告warning,主要是向用户提供非致命警告,指出运行一个程序时遇到的问题,通常来说,我们最好是在程序中不要出现这些东西,否则我们就需要从新审视我们的代码了。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD48aDE+0rujrldhcm5pbmctLS23x9bCw/y+r7jmPC9oMT48cD6+r7jmyrnTw7XEysfE2tbD0uyzo8DgV2FybmluZ7XE19PA4L340NC31sDgo6zNqLOj0OjSqrj5vt25/cLLxvejqGZpbHRlcqOpyejWw8C0tKbA7aGjuf3Cy8b30ruw47D8wKijrEFjdGlvbqOsTWVzc2FnZSxDYXRlZ29yeSxNb2R1bGW6zUxpbmUgbnVtYmVyLtKyv8nS1NXiw7TA7b3io6zV4sDvw+a1xM/7z6JNZXNzYWdlsr+31s2os6PKx9K7uPbGpcXkvq+45s7Esb61xNX91PKx7bTvyr2jrMDgsfBDYXRyZWdvcnnKx9K7uPbS7LOjwOC1xMP7s8ajrMSjv+lNb2R1bGWw/Lqs0ru49tX91PKx7bTvyr2jrNKq0+vJ+rPJvq+45rXExKO/6cP7xqXF5KOs0NC6xUxpbmUgTnVtYmVyv8nS1LjEseTU2tK7uPa+r7jms/bP1sqxtcS0psDtPC9wPjxwPsO/tbHJ+rPJ0ru49r6vuObKsaOstrzQ6NKqvavG5NPr16Ky4bn9tcS5/cLLxvexyL3Po6y12tK7uPbGpcXktcS5/cLLxve9q7/Y1sbV4rj2vq+45rLJyKG1xLav1/ejrLfx1PKyycihxKzIz7XEtq/X96OsxuTKtbG+1srB97PMyc+74beiz9bT60V4Y2VwdGlvbtLss6O0psDtyOez9tK71d6jrL+00rvPwrOjvPu1xLn9wsvG97av1/ejujwvcD48dGFibGU+PHRib2R5Pjx0cj48dGQgdmFsaWduPQ=="top">

动作

含义

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异常,作为测试失败的一个特殊提示,如下所示:

-陡浐讋+D8Q+畩鉃洯系统级别函数返回错误时会产生OSError

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

RefernceError:

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

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

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

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

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

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

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

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

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

ZeroDivisionError:0做分母时抛出

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



相关内容

    暂无相关文章

评论关闭