前言:
眼前咱们对“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异常处理