一、什么是异常处理
定义:异常处理就是我们在写Python时,经常看到的报错信息,例如:NameError TypeError ValueError等,这些都是异常。
异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,在Python中无法处理程序时就会发生异常,异常时Python的一个对象,表示一个错误,当Python脚本发生异常时,我们需要捕获并处理异常,否则程序就会终止执行。
1. except语句
用于捕捉发生的错误,except X语句要放在except之前,否则except X语句将无法执行。
2. else语句
如果try中没有发生异常,将会执行else语句
try ....except...else 语句,当没有异常发生时,else中的语句将会被执行。
3. finally语句
finally语句在程序返回之前执行,也就是说,它总会执行。
4. return
如果finally中有return语句,则执行finally中的return语句返回;如果finally中没有return语句,则返回到转入finally之前的代码段中返回。
5. 打印异常信息
import traceback
def func(x, y):
try:
a = x / y
print(a)
except Exception as e:
print(str(e))
# 返回字符串类型,只给出异常信息,不包括异常信息的类型
print(repr(e))
# 给出较全的异常信息,包括异常信息的类型
print(e.message)
# 获得的信息同str(e)
# 采用traceback模块
# 需要导入traceback模块,此时获取的信息最全,与python命令行运行程序出现错误信息一致
print(traceback.print_exc())
# 使用traceback.print_exc()打印异常信息到标准错误,就像没有获取一样
print(traceback.format_exc())
# 使用traceback.format_exc()将同样的输出获取为字符串
# 可以向这些函数传递各种各样的参数来限制输出,或者重新打印到像文件类型的对象
func(10, 0)
# 采用sys模块回溯最后的异常
# 另一种获取异常信息的途径是通过sys模块中的exc_info()函数
# 该函数回返回一个三元组:(异常类,异常类的实例,跟踪记录对象)
import sys
try:
block
except:
info = sys.exc_info()
print(info[0], ":", info[1])
print(info)
# sys.exc_info()的返回值是一个tuple, (type, value/message, traceback)
# 这里的type ---- 异常的类型
# value/message ---- 异常的信息或者参数
# traceback ---- 包含调用栈信息的对象。
try:
1 / 0
except:
import sys
e = sys.exc_info()
print(e)
二、异常处理
首先我们来说一下try语句的语法:
try语句与except 相结合使用,此语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理,如果不想在发生异常时结束程序,只需要在try语句中捕获异常即可
try:
print("Exception")
x = 10
y = 0
a = x / y
print('a=', a)
except Exception as ex:
print(ex)
三、抛出异常
在Python中使用raise语句抛出一个指定的异常,我们可以使用类或实例参数调用raise语句引发异常。
class EvaException(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
try:
raise EvaException('类型错误')
except EvaException as e:
print(e)
四、捕捉多个异常
在Python中支持一个try/except语句处理多个异常,语法如下:
try:
dic = {1: 2}
doc[3]
except NameError:
print('名字没有定义')
except KeyError:
print('没有这个key')
五、异常中else
def func(x, y):
try:
a = x / y
print(a)
except Exception:
print('Error,happened')
else:
print('没有异常')
func(2, 0)
六、主动触发异常
try:
raise TypeError('类型错误')
except Exception as e:
print(e)
七、用户自定义异常
你可以通过创建一个新的exception类来拥有自己的异常。异常应该继承自 Exception 类,或者直接继承,或者间接继承。
class EvaException(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
try:
raise EvaException('类型错误')
except EvaException as e:
print(e)
八、定义清理行为(finally语句)
try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。
不管 try 子句里面有没有发生异常,finally 子句都会执行。 如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后再次被抛出。
九、两个特殊的处理异常的简便方法
1,断言(assert)
assert expression[,reason] 其中assert是断言的关键字。
执行该语句的时候,先判断表达式expression, 如果assert后面的表达式为真,则什么都不做, 如果不为真,就会抛出AssertionError异常,assert异常也可以被try块捕获。assert的异常参数,是在断言表达式后添加字符串信息,用来解释断言并更好的知道是哪里出了问题。
try:
assert len('police') == len('polite')
assert 3 == 3
assert 3 == 4, "3 is not equal 4!"
except AssertionError as reason:
print("%s:%s" % (reason.__class__.__name__, reason))
2,上下文管理(with语句)
如果你使用try, except, finally代码仅仅是为了保证共享资源(如文件,数据)的唯一分配,并在任务结束后释放它,那么可以使用with语句。这个with语句可以让你从try, except, finally中解放出来!
with open('C:\\Users\\xhj98\\Desktop\\java.txt') as f:
for line in f:
print(line)
无论代码中是否出现异常,Python都会为我们关闭这个文件,我们不需要关心这些细节。不是所有的对象都可以使用with语句,只有支持上下文管理协议(context management protocol)的对象才可以,具体如下:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
十、Python所有的标准异常类:
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
SystemExit | Python 解释器请求退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |