龙空技术网

Python基础笔记八——异常

零辰4点 451

前言:

眼前咱们对“python socket异常处理”大致比较关怀,朋友们都想要分析一些“python socket异常处理”的相关文章。那么小编在网摘上网罗了一些关于“python socket异常处理””的相关知识,希望兄弟们能喜欢,各位老铁们一起来了解一下吧!

第8章 异常

8.1什么是异常

Python用异常对象来表示异常情况。如果异常对象并未被处理或捕捉,程序就会用回溯(traceback,一种错误信息)终止执行。

8.2按自己的方式出错

8.2.1 raise 语句

使用一个类(Exception的子类或者实例参数调用raise语句。

>>> raise Exception

Traceback (most recent call last):

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

Exception

>>> raise Exception('hyperdrive overload')

Traceback (most recent call last):

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

Exception: hyperdrive overload

内建异常都可以在exceptions模块中找到。

最重要的一些内建异常类

类名

描述

Exception

所有异常的基类

AttributeError

特性引用或赋值失败时引发

IOError

试图打开不存在文件(包括其他情况)时引发

IndexError

在使用序列中不存在的索引时引发

KeyError

在使用映射中不存在的键时引发

NameError

在找不到名字(变量)时引发

SyntaxError

在代码为错误形式时引发

TypeError

在内建操作或者函数应用于错误类型的对象时引发

ValueError

在内建操作或者函数应用于正常类型的对象,但是该对象使用不合适的值时引发

ZeroDivisionError

在除法或者模除操作的第二个参数为0引发

8.2.2自定义异常类

自定义异常类基本上就是下面这样,当然也可以继承其他的内建异常类。

>>> class SomeCustomException(Exception):

... pass

...

8.3捕捉异常

try/except语句来实现

注*如果没有捕捉异常,会被传播到调用的函数中。如果那里仍然没有捕获,这些异常就会流到程序的最顶层。

重新引发异常,可以调用不带参数的raise:

>>> class Calculator:

... flag = False

... def calc(self,expr):

... try:

... return eval(expr)

... except ZeroDivisionError:

... if self.flag :

... print 'Division by zero is illega!'

... else:

... raise

...

>>> calculator = Calculator()

>>> calculator.calc('10/2')

5

>>> calculator.calc('10/0') #未关闭,重新引发异常

Traceback (most recent call last):

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

File "<stdin>", line 5, in calc

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

ZeroDivisionError: integer division or modulo by zero

>>> calculator.flag = True

>>> calculator.calc('10/0') # 关闭,处理异常

Division by zero is illega!

8.4不止一个except子句

except 可以有多个子句

8.5 用一个块捕捉两个异常。

用一个块捕捉多个类型异常,可以将它们作为元组列出:

try:

pass

except (ZeroDivisionError,TypeError):

pass

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

8.6捕捉对象

希望在except子句中访问异常对象本身,可以使用两个参数(注*要捕捉到多个异常,也只需向except子句提供一个参数(元组))。

>>> try:

... 1/0

... except (Exception,),e:

... print e

...

integer division or modulo by zero

注* Python3.x中,except子句会要写成except (ZeroDivisionError,TypeRrror) as e

8.7真正的全捕捉

可以在except子句中忽略所有的异常类,直接 except:即可。

注*这样捕捉所有异常很危险,用except Exception,e会更好,记录与分析不可预测的异常。

8.8万事大吉

try/except语句加个else,表示没有异常发生时执行。

8.9 最后。。。

finally子句,不管try子句中是否发生异常都会执行。所以 用来做一些清理处理是十分有用的,例如文件关闭 ,socket关闭等。

完整的异常结构:

try:

1/0

except NameError:

print '捕捉异常'

else :

print '异常未发生时执行'

finally:

print '总会执行'

标签: #python socket异常处理