《Python基础教程》第八章–读书笔记
admin
2023-07-31 01:44:20
0

第八章:异常

python的异常对象提供了非常强大的替代方案。

什么是异常

python用异常对象(ecxeption object)来表示异常情况。遇到错误之后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(traceback,一种错误信息)终止执行。

事实上,每个异常都是一些类的实例,这些实例可以被引发,并且可以用很多方法进行捕捉,使得程序可以捉住错误并且对其进行处理,而不是让整个程序失效。

按自己的方式出错

如何引发异常,以及创建自己的异常类型。

raise语句

为了引发异常,可以使用一个类(应该是Exception的子类)或者实例参数调用raise语句。使用类时,程序会自动创建类的一个实例。

>>>raise Exception
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
 in ()
----> 1 raise Exception
 
Exception: 
>>>raise Exception(\'hyperdrive overload\')
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
 in ()
----> 1 raise Exception(\'hyperdrive overload\')
 
Exception: hyperdrive overload

第二个例子引发了错误,并且添加了错误信息。

内建的异常类有很多。python库参考手册的built-in exceptions一节中有关于它们的描述。用交互式解释器可以分析它们,这些内建异常都可以在exceptions模块(和内建的命名空间)中找到。

下表描述了一些最重要的的内建异常类:

类名 描述
Exception 所有异常的基类
AttributeError 特性引用或赋值失败时引发
IOError 试图打开不存在文件(包括其他情况)时引发
IndexError 在使用序列中不存在的索引时引发
KeyError 在使用映射中不存在的键时引发
NameError 在找不到名字(变量时)引用
SyntaxError 在代码为错误形式时引发
TypeError 在内建操作或者函数引用于错误类型的对象时引发
ValueError 在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发
ZeroDivisinError 在除法或者模除操作的第二个参数为0时引发

自定义异常类

那么如何创建自己的异常类呢?就像其他类一样,只是要确保从Exception类继承(不管是间接的或者直接的,也就是说继承其他的内建异常类也是可以的)。

class SomeCunstomException(Exception):pass

捕捉异常

关于异常的最有意思的地方就是可以处理它们(通常叫做诱捕异常或捕捉异常)。这个功能使用try/except语句来实现。

try:
    x = input(\"enter a number:\")
    y = input(\"enter another number:\")
    print x/y
except ZeroDivisionError:
    print \"the second number can\'t be zero\"

不止一个except子句

利用多个except子句,可以捕捉不同类型的异常,给出相应的提示,很方便

用一个块捕捉两个异常

相比上面用多个except捕捉异常,用一个块捕捉异常显得方便点。“眉毛胡子一把抓”。

try:
    x = input(\"enter a number:\")
    y = input(\"enter another number:\")
    print x/y
except (ZeroDivisionError,TypeError,NameError):
    print \"Your number were bogus……\"

注:except子句中异常对象外面的圆括号很重要。忽略它们是一种常见的错误

捕捉对象

因为某种原因,“眉毛胡子一把抓”时的错误也想打印下来,这个功能就很有用。

   
try:
    x = input(\"enter a number:\")
    y = input(\"enter another number:\")
    print x/y
except (ZeroDivisionError,TypeError,NameError),e:
    print e
    

在python3中,except子句会被写作except (ZeroDivisionError,TypeError,NameError) as e:

真正的全捕捉:

try:
    x = input(\"enter a number:\")
    y = input(\"enter another number:\")
    print x/y
except Exception,e:    #也可以直接except:但是,这样的捕捉所有异常时危险的,因为它会隐藏所有程序员未想到并且未做好准备处理的错误。
    print \"something wrong happened\"
enter a number:1
enter another number:
something wrong happened

最后……

最后,是finally子句。它可以用来在可能的异常后进行清理。它和try子句联合使用。

finally子句肯定会被执行,不管是否发生异常。

异常和函数

异常和函数能很自然的在一起工作。如果异常在函数内引发而不被处理,它就会传播至(浮到)函数调用的地方。如果在那里也没有处理异常,它就会继续传播,一直到达主程序(全局作用域)。如果那里没有异常处理程序,程序就会带着栈跟踪终止。

本章小结:

  • 异常处理并不是很复杂。如果知道某段代码可能会导致异常,而又不希望程序以堆栈跟踪(没明白)的形式终止,那么就根据需要添加try/except或者try/finally语句(或者它们结合)进行处理。

  • else子句。除了except子句,可以使用else子句。如果主try块中没有引发异常,else子句就会被执行。

今天看了下《python核心编程》介绍类方面的内容,确实介绍更详细点啊。囧。当时早知道看它好了,不过已经选择了,就把《python基础教程》看完了好了。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...