一、异常的定义产生异常的动作被称为引发(raise)或抛出(throw)异常。
响应异常的动作被称为捕获(catch)异常。
处理异常的代码则称为异常处理代码exception-handling code)或简称为异常处理程序(exception handler)。
二、python中的异常异常是Python函数用raise语句自动生成的对象。
在异常对象生成后,引发异常的raise语句将改变Python程序的执行方式,这与正常的执行流程不同了。
不是继续执行raise的下一条语句,也不执行生成异常后的下一条语句,而是检索当前函数调用链,查找能够处理当前异常的处理程序。
如果找到了异常处理程序,则会调用它,并访问异常对象获取更多信息。如果找不到合适的异常处理程序,程序将会中止并报错。
Python更依赖于“异常”,在错误发生之后再做处理。
三、捕获并处理异常
# 1.首先执行的是try语句的body部分
try:
body
# 4.如果有异常向try抛出,则会依次搜索各条except子句,查找关联的异常类型与抛出的异常匹配的子句。
except exception_type1 as var1:
exception_code1
except exception_type2 as var2:
exception_code2
except:
default_exception_code
# 2.如果执行成功,也就是try语句没有捕获到有异常抛出,那就执行else_body部分,并且try语句执行完毕。
else:
else_body
# 3.因为这里有条finally语句,所以接着会执行finally_body部分。
finally:
finally_bodyexceptexception_type as var:这行匹配上了某抛出的异常exc,就会创建变量var,并在执行该except语句的异常处理代码之前,将var的值赋为exc。var不是必需的,可以只出现except exception_type:这种写法,给定类型的异常仍然能被捕获,只是不会把异常赋给某个变量了。
try语句的else子句是可选的,也很少被用到。当且仅当try语句的body部分执行时没有抛出任何错误时,else子句才会被执行。
因为finally块始终会被执行,所以能在异常处理完成后,通过关闭文件、重置变量之类的操作提供一个加入资源清理代码的机会。
四、内置异常
在 Python 中,所有异常必须为一个派生自BaseException的类的实例。内置异常类可以被子类化以定义新的异常;鼓励程序员从Exception类或它的某个子类而不是从BaseException来派生新的异常。
BaseException ————所有内置异常的基类
+– SystemExit ————此异常由 sys.exit() 函数引发。 它继承自 BaseException 而不是 Exception 以确保不会被处理 Exception 的代码意外捕获。
+– KeyboardInterrupt ————当用户按下中断键 (通常为 Control-C 或 Delete) 时将被引发。
+– GeneratorExit ————当一个 generator 或 coroutine 被关闭时将被引发
+– Exception ————所有内置的非系统退出类异常都派生自此类。 所有用户自定义异常也应当派生自此类。
+– StopIteration ————由内置函数 next() 和 iterator 的 __next__() 方法所引发,用来表示该迭代器不能产生下一项。
+– StopAsyncIteration ————必须由一个 asynchronous iterator 对象的 __anext__() 方法来引发以停止迭代操作。
+– ArithmeticError ————此基类用于派生针对各种算术类错误而引发的内置异常
| +– FloatingPointError
| +– OverflowError ————当算术运算的结果大到无法表示时将被引发。
| +– ZeroDivisionError ————当除法或取余运算的第二个参数为零时将被引发。
+– AssertionError ————当 assert 语句失败时将被引发。
+– AttributeError ————当属性引用或赋值失败时将被引发
+– BufferError ————当与 缓冲区 相关的操作无法执行时将被引发。
+– EOFError ————当 input() 函数未读取任何数据即达到文件结束条件 (EOF) 时将被引发
+– ImportError ————当 import 语句尝试加载模块遇到麻烦时将被引发。
| +– ModuleNotFoundError ————当一个模块无法被定位时将由 import 引发
+– LookupError ————此基类用于派生当映射或序列所使用的键或索引无效时引发的异常
| +– IndexError ————当序列抽取超出范围时将被引发。
| +– KeyError ————当在现有键集合中找不到指定的映射(字典)键时将被引发。
+– MemoryError ————当一个操作耗尽内存但情况仍可(通过删除一些对象)进行挽救时将被引发。
+– NameError ————当某个局部或全局名称未找到时将被引发。
| +– UnboundLocalError ————当在函数或方法中对某个局部变量进行引用,但该变量并未绑定任何值时将被引发。
+– OSError
| +– BlockingIOError ————当一个操作会被某个设置为非阻塞操作的对象(例如套接字)所阻塞时将被引发。
| +– ChildProcessError ————当一个子进程上的操作失败时将被引发。
| +– ConnectionError ————与连接相关问题的基类。
| | +– BrokenPipeError ————当试图写入另一端已被关闭的管道,或是试图写入已关闭写入的套接字时将被引发。
| | +– ConnectionAbortedError ————当连接尝试被对端中止时将被引发。
| | +– ConnectionRefusedError ————当连接尝试被对端拒绝时将被引发。
| | +– ConnectionResetError ————当连接被对端重置时将被引发。
| +– FileExistsError ————当试图创建一个已存在的文件或目录时将被引发。
| +– FileNotFoundError ————当所请求的文件或目录不存在时将被引发。
| +– InterruptedError ————当系统调用被输入信号中断时将被引发。
| +– IsADirectoryError ————当请求对一个目录执行文件操作 (例如 os.remove()) 将被引发。
| +– NotADirectoryError ————当请求对一个非目录对象执行目录操作 (例如 os.listdir()) 时将被引发。
| +– PermissionError ————当在没有足够操作权限的情况下试图执行某个操作时将被引发 —— 例如缺少文件系统权限
| +– ProcessLookupError ————当给定的进程不存在时将被引发。
| +– TimeoutError ————当一个系统函数发生系统级超时的情况下将被引发。
+– ReferenceError ————此异常将在使用 weakref.proxy() 函数所创建的弱引用来访问该引用的某个已被作为垃圾回收的属性时被引发。
+– RuntimeError ————当检测到一个不归属于任何其他类别的错误时将被引发。
| +– NotImplementedError
| +– RecursionError ————它会在解释器检测发现超过最大递归深度时被引发。
+– SyntaxError ————当解析器遇到语法错误时将被引发。
| +– IndentationError ————与不正确的缩进相关的语法错误的基类。 这是 SyntaxError 的一个子类。
| +– TabError ————当缩进包含对制表符和空格符不一致的使用时将被引发。
+– SystemError ————当解释器发现内部错误,但情况看起来尚未严重到要放弃所有希望时将被引发
+– TypeError ————当一个操作或函数被应用于类型不适当的对象时将被引发。
+– ValueError ————当操作或函数接收到具有正确类型但值不适合的参数,并且情况不能用更精确的异常例如 IndexError 来描述时将被引发
| +– UnicodeError ————当发生与 Unicode 相关的编码或解码错误时将被引发。
| +– UnicodeDecodeError ————当在解码过程中发生与 Unicode 相关的错误时将被引发。
| +– UnicodeEncodeError ————当在编码过程中发生与 Unicode 相关的错误时将被引发。
| +– UnicodeTranslateError ————在转写过程中发生与 Unicode 相关的错误时将被引发。
+– Warning ————警告类别的基类。
+– DeprecationWarning
+– PendingDeprecationWarning
+– RuntimeWarning
+– SyntaxWarning
+– UserWarning
+– FutureWarning
+– ImportWarning
+– UnicodeWarning
+– BytesWarning
+– ResourceWarning