LeaCoder

Python3内置异常

2019-04-25
leacoder

Python Standard Library based on Python 3.7.3 https://docs.python.org/3/library/

Python标准库 - 内置异常

Link: [https://docs.python.org/3/library/exceptions.html#built-in-exceptions

说明 print 后的 # 注释为输出和相关说明,包含所有 Python3.7.3 官方文档中的内置异常

部分异常未代码实现测试

异常基本操作 可参考 http://www.runoob.com/python3/python3-errors-execptions.html

GitHub Code : Built-in Exceptions.py

Exception hierarchy

异常层次结构

异常层次结构.png Exception hierarchy End

基类

以下异常主要用作其他异常的基类。

exception BaseException

# exception BaseException
'''
所有内置异常的基类,但并不意味这能被用户自定义类直接继承
'''
# exception BaseException End

exception Exception

# exception Exception
'''
所有内置的,非系统退出的异常都派生自此类。所有用户定义的异常也应该从该类派生。
'''
# exception Exception End

exception ArithmeticError

# exception ArithmeticError
'''
针对各种算术错误引发的内置异常的基类:OverflowError,ZeroDivisionError,FloatingPointError。
'''
# exception ArithmeticError End

exception BufferError

# exception BufferError
'''
当不能进行缓冲相关操作引发。
'''
# exception BufferError End

exception LookupError

# exception LookupError
'''
当映射或序列上使用的键或索引无效时引发的异常的基类:IndexError,KeyError。这可以通过codecs.lookup()直接引发。
'''
# exception LookupError End

基类 End

具体异常

以下异常是常常被触发的异常

exception AssertionError

'''
@Description: 
    当assert语句失败时触发。
@Param: 
@Return: 
'''
# exception AssertionError
try:
    assert( -1 > 0 )
except AssertionError:
    print("exception AssertionError Test")  # exception AssertionError Test
# exception AssertionError End

exception AttributeError

'''
@Description: 
    当属性引用(参见 https://docs.python.org/3/reference/expressions.html#attribute-references )或赋值失败时引发。
    (当一个对象根本不支持属性引用或属性赋值时,会引发TypeError。)
@Param: 
@Return: 
'''
# exception AttributeError
class A:
    def __init__(self,x):
        self.x = x
a = A(5)
print(a.x)  # 5
try:
    print(a.y)
except AttributeError:
    print("exception AttributeError Test")  # exception AttributeError Test  
# exception AttributeError End

exception EOFError

'''
@Description: 
    当input()函数在没有读取任何数据的情况下达到文件结束条件(EOF)时引发。
@Param: 
@Return: 
'''
# exception EOFError
try:
    s = input('ctrl+d to raise EOFError:\r\n')
except EOFError:
    print("exception EOFError Test")    # exception EOFError Test
# exception EOFError End

exception FloatingPointError

'''
@Description: 
    目前尚未使用。
@Param: 
@Return: 
'''
# exception FloatingPointError
# exception FloatingPointError End

exception GeneratorExit

'''
@Description: 
    当发generator或coroutine关闭时抬起;请参阅generator.close()和coroutine.close()。
    它直接继承自BaseException而不是Exception,因为它在技术上不是错误。
@Param: 
@Return: 
'''
# exception GeneratorExit
# 参看 https://stackoverflow.com/questions/30862196/generatorexit-in-python-generator
def myGenerator(n):  
    while n > 0:
        try:
            yield n
        except GeneratorExit:
            print("exception GeneratorExit Test")
        n -= 1
gen = myGenerator(1)
print(next(gen))    # exception GeneratorExit Test   
del gen
# exception GeneratorExit End

exception ImportError

'''
@Description: 
    导入语句尝试加载模块遇到问题时触发,或者 当 “from list” 在 from ... import中有个名称没有时触发
@Param: 
@Return: 
'''
# exception ImportError
try:
    from sys import nofunc
except ImportError:
    print("exception ImportError Test") # exception ImportError Test
# exception ImportError End

exception ModuleNotFoundError

'''
@Description: 
    ImportError的子类,当无法找到模块时由import触发,或者在sys.modules没找到时也会触发。
@Param: 
@Return: 
'''
# exception ModuleNotFoundError
try:
    import Module
except ModuleNotFoundError:
    print("exception ModuleNotFoundError Test") # exception ModuleNotFoundError Test

try:
    from sys.modules import nofunc
except ModuleNotFoundError:
    print("exception ModuleNotFoundError Test") # exception ModuleNotFoundError Test
# exception ModuleNotFoundError End

exception IndexError

'''
@Description: 
    当序列下标超出范围时触发,切片索引被默默截断以落在允许的范围内;如果索引不是整数,则会引发TypeError。
@Param: 
@Return: 
'''
# exception IndexError
listtmp = [0,1,2,3,4]
try:
    listtmp[6]
except IndexError:
    print("exception IndexError Test")  # exception IndexError Test

try:
    listtmp[0.1]
except TypeError:
    print("exception TypeError Test")   # exception TypeError Test
# exception IndexError End

exception KeyError

'''
@Description: 
    当一个map或者dict的key没有在key的集合中时触发
@Param: 
@Return: 
'''
# exception KeyError
dicttmp = {'a':1,'b':2}
try:
    print(dicttmp['a']) # 1
    print(dicttmp['c'])
except KeyError:
    print("exception KeyError Test")    # exception KeyError Test
# exception KeyError End

exception KeyboardInterrupt

'''
@Description: 
    当用户点击中断键(通常是Control-C或Delete)时触发,在执行期间,定期检查中断。
    该异常继承自BaseException,以免被捕获Exception的代码意外捕获,从而阻止解释器退出。
@Param: 
@Return: 
'''
# exception KeyboardInterrupt
try:
    s = input('ctrl+c to raise KeyboardInterrupt:\r\n')
except KeyboardInterrupt:
    print("exception KeyboardInterrupt Test")    # exception KeyboardInterrupt Test
# exception KeyboardInterrupt End

exception MemoryError

'''
@Description: 
    当一个操作耗尽内存但是情况仍然可能被挽救(通过删除一些对象)时触发,关联值是一个字符串,表示内存中耗尽了哪种(内部)操作。
    由于底层的内存管理架构(C的malloc()函数),解释器可能无法始终从这种情况中完全恢复; 然而,它会引发异常,以便可以打印堆栈回溯,以防出现失控程序。
@Param: 
@Return: 
'''
# exception MemoryError
from sys import getsizeof
try:
    a = [0] * 1024 * 1024 * 1024
    print(getsizeof(a))
except MemoryError:
    print("exception MemoryError Test")     # exception MemoryError Test
# exception MemoryError End

exception NameError

'''
@Description: 
    当找不到局部或全局名称时触发,这仅适用于不合格的名称。关联的值是包含无法找到的名称的错误消息。
@Param: 
@Return: 
'''
# exception NameError
try:
    print(noname)
except NameError:
    print("exception NameError Test")   # exception NameError Test
# exception NameError End

exception NotImplementedError

'''
@Description: 
    此异常派生自RuntimeError。
    在用户定义的基类中,抽象方法在需要派生类重写方法时触发
@Param: 
@Return: 
'''
# exception NotImplementedError

class ClassDemo(object):
    def func(self):
        raise NotImplementedError

class ChildClassDemo(ClassDemo):
    def funcChild(self):
        print('def funcChild(self):')

try:
    demo = ChildClassDemo()
    demo.funcChild()
    demo.func()
except NotImplementedError:
    print("exception NotImplementedError Test") # exception NotImplementedError Test
# exception NotImplementedError End

OSError([arg])

'''
@Description: 
    exception OSError([arg])
    exception OSError(errno, strerror[, filename[, winerror[, filename2]]])   
    当系统函数返回与系统相关的错误时会引发此异常,包括I / O失败,例如“找不到文件”或“磁盘已满”(不是非法参数类型或其他偶然错误)。
    构造函数的第二种形式,属性默认为None
@Param: 
    errno -- 来自C变量errno的数字错误代码。
    winerror -- 在Windows下,这将为您提供本机Windows错误代码。在Windows下,如果winerror构造函数参数是整数,则根据Windows错误代码确定errno属性,并忽略errno参数。
    strerror -- 操作系统提供的相应错误消息。
    filename
    filename2
    对于涉及文件系统路径的异常(例如open()或os.unlink()),filename是传递给函数的文件名。 
    对于涉及两个文件系统路径(例如os.rename())的函数,filename2对应于传递给函数的第二个文件名。
@Return: 
'''
# OSError([arg])
filename = 'nofile'
try:
    f = open(filename)
except OSError as e:
    print("exception OSError Test")     # exception OSError Test
    print("e.errno = {}".format(e.errno))   # e.errno = 2
    # print("e.winerror = {}".format(e.winerror)) #报错 因为不在windows下 object has no attribute 'winerror'
    print("e.strerror = {}".format(e.strerror)) # e.strerror = No such file or directory
    print("e.filename = {}".format(e.filename)) # e.filename = nofile
# OSError([arg]) End

exception OverflowError

'''
@Description: 
    当算术运算的结果太大而无法表示时触发,整数不会发生这种情况(更倾向于触发 MemoryError )
    但是,由于历史原因,有时会在超出所需范围的整数时引发OverflowError。由于C中缺少浮点异常处理的标准化,因此不检查大多数浮点运算。
@Param: 
@Return: 
'''
# exception OverflowError
try:
    def pi(): 
        pi = 0 
        for k in range(350): 
            pi += (4./(8.*k+1.) - 2./(8.*k+4.) - 1./(8.*k+5.) - 1./(8.*k+6.)) / 16.**k 
        return pi 
    print(pi())
except OverflowError:
    print("exception OverflowError Test")  # exception OverflowError Test
# 例子 来自 https://stackoverflow.com/questions/20201706/overflowerror-34-result-too-large
# exception OverflowError End

exception RecursionError

'''
@Description: 
    此异常派生自RuntimeError。当解释器检测到超出最大递归深度触发
@Param: 
@Return: 
'''
# exception RecursionError
try:
    def recursion(n):
        if (n <= 1):
            return
        recursion(n - 1)
    recursion(998)  # RecursionError: maximum recursion depth exceeded in comparison
except RecursionError: # ?? 不知道为啥 捕获不到
    print("exception RecursionError Test")
# exception RecursionError End

exception ReferenceError

'''
@Description: 
    当weakref.proxy()函数创建的弱引用代理用于在垃圾回收后访问引用的属性时触发
    
@Param: 
@Return: 
'''
# exception ReferenceError
import weakref
class Foo(object):
    pass
foo = Foo()
proxy = weakref.proxy(foo)
print(proxy)    # <__main__.Foo object at 0x7f3d469af128>
del foo
try:
    print(proxy)   
except ReferenceError:
    print("exception ReferenceError Test")  # exception ReferenceError Test
# exception ReferenceError End

exception RuntimeError

'''
@Description: 
    检测到的错误不属于任何其他类别触发。
@Param: 
@Return: 
'''
# exception RuntimeError
def checkthenum(num):
    if num > 0:
        pass
    elif num < 0:
        pass
    else:
        raise RuntimeError
try:
    checkthenum(0)
except RuntimeError as e:
    print("exception RuntimeError Test")    # exception RuntimeError Test
# exception RuntimeError End

exception StopIteration

'''
@Description: 
    由内置函数next()和迭代器的__next __()方法触发,表示迭代器没有其他项。
@Param: 
@Return: 
'''
# exception StopIteration
def funcStopIteration(n):
    while n > 0:
        yield n
        n -= 1
list1 = funcStopIteration(2) # <generator object funcStopIteration at 0x7fcc5e1d7c78>
print(list1)
try:
    next(list1) 
    next(list1) 
    next(list1) 
except StopIteration:
    print("exception StopIteration Test")   # exception StopIteration Test
# exception StopIteration End

exception StopAsyncIteration

'''
@Description: 
    必须由异步迭代器对象的__anext __()方法引发以停止迭代。
@Param: 
@Return: 
'''
# exception StopAsyncIteration
class TestImplementation:
    def __aiter__(self):
        return self
    async def __anext__(self):
        raise StopAsyncIteration    

async def test_async_for(): 
    async for _ in TestImplementation():    # exception StopAsyncIteration Test
        pass

# exception StopAsyncIteration End

exception SyntaxError

'''
@Description: 
    解析器遇到语法错误触发
    这可能发生在import语句中,调用内置函数exec()或eval(),或者在读取初始脚本或标准输入时触发。
@Param: 
@Return: 
'''
# exception SyntaxError
strtmp = "for i in range(0,10) print(i)" 
try:
    exec(strtmp)
except SyntaxError:
    print("exception SyntaxError Test") # exception SyntaxError Test
# exception SyntaxError End

exception IndentationError

'''
@Description: 
    与不正确的缩进相关的语法错误的基类。这是SyntaxError的子类。
@Param: 
@Return: 
'''
# exception IndentationError
# exception IndentationError End

exception TabError

'''
@Description: 
    缩进包含tabs和空格,Tab 和空格混用。这是IndentationError的子类。
@Param: 
@Return: 
'''
# exception TabError

# exception TabError End

exception SystemError

'''
@Description: 
    一般的解释器系统错误
@Param: 
@Return: 
'''
# exception SystemError

# exception SystemError End

exception SystemExit

'''
@Description: 
    解释器请求退出,sys.exit()函数引发此异常。
@Param: 
@Return: 
'''
# exception SystemExit
import sys
try:
    sys.exit()
except SystemExit:
    print("exception SystemExit Test")  # exception SystemExit Test
# exception SystemExit End

exception TypeError

'''
@Description: 
    将不适当类型的对象用于操作或函数时触发
    关联值是一个字符串,提供有关类型不匹配的详细信息。
@Param: 
@Return: 
'''
# exception TypeError

try:
    num = 1
    next(num)
except TypeError as e:
    print("exception TypeError Test")   # exception TypeError Test
# exception TypeError End

exception UnboundLocalError

'''
@Description: 
    当引用函数或方法中的局部变量,但变量未初始化时触发。这是NameError的子类。
@Param: 
@Return: 
'''
# exception UnboundLocalError
def funcUnboundLocalError():
    test
    test += 1

try:
    funcUnboundLocalError()
except UnboundLocalError:
    print("exception UnboundLocalError Test")   # exception UnboundLocalError Test
# exception UnboundLocalError End

exception UnicodeError

'''
@Description: 
    发生与Unicode相关的 编码或解码 错误时触发。它是ValueError的子类。
    UnicodeError具有描述编码或解码错误的属性。例如,err.object [err.start:err.end]给出编解码器失败的特定无效输入。
@Param: 
    encoding - 引发错误的编码的名称
    reason  - 描述特定编解码器错误的字符串
    object - 编解码器试图编码或解码的对象。
    start - 对象中无效数据的第一个索引。
    end - 对象中最后一个无效数据后的索引。
@Return: 
'''
# exception UnicodeError
'''
exception UnicodeEncodeError: 在编码期间发生与Unicode相关的错误时引发。它是UnicodeError的子类。
exception UnicodeDecodeError: 在解码期间发生与Unicode相关的错误时引发。它是UnicodeError的子类。
exception UnicodeTranslateError: 在翻译期间发生与Unicode相关的错误时引发。它是UnicodeError的子类。
'''
# exception UnicodeError End

exception ValueError

'''
@Description: 
    当操作或函数接收到具有正确类型但值不合适的参数的情况时引发
@Param: 
@Return: 
'''
# exception ValueError
try:
    int("hello world")
except ValueError:
    print("exception ValueError Test")  # exception ValueError Test
# exception ValueError End

exception ZeroDivisionError

'''
@Description: 
    当除法或模运算的第二个参数为零时触发
@Param: 
@Return: 
'''
# exception ZeroDivisionError

try:
    1/0
except ZeroDivisionError:
    print("exception ZeroDivisionError Test")   # exception ZeroDivisionError Test
# exception ZeroDivisionError End
'''
@Description: 
    保留以下异常以与先前版本兼容;从Python 3.3开始,它们是OSError的别名。
@Param: 
@Return: 
'''
# 保留以下异常以与先前版本兼容;从Python 3.3开始,它们是OSError的别名。
'''
exception EnvironmentError
exception IOError
exception WindowsError
'''
# 保留以下异常以与先前版本兼容;从Python 3.3开始,它们是OSError的别名。 End

具体异常 End

OS exceptions

以下异常是OSError的子类,它们会根据系统错误代码而产生。

exception BlockingIOError

'''
@Description: 
    当一个操作阻塞一个设置为非阻塞操作的对象(例如套接字)时触发
@Param: 
@Return: 
'''
# exception BlockingIOError
import socket
TCP_IP = '192.168.1.10'
TCP_PORT = 7
class TcpClient:
    def __init__(self):
        self.s = socket.socket(socket.AF_INET,  socket.SOCK_STREAM)
        self.s.settimeout(5)

    def connect(self):
        self.s.connect((TCP_IP,  TCP_PORT))

client = TcpClient()
while True:
    try:
        client.connect()
    except socket.timeout:
        print("socket.timeout") # socket.timeout
    except BlockingIOError:
        print("exception BlockingIOError Test") # exception BlockingIOError Test
        break
           
# exception BlockingIOError End

exception ChildProcessError

'''
@Description: 
    在对子进程执行操作失败时触发。对应于errno ECHILD。
@Param: 
@Return: 
'''
# exception ChildProcessError
# exception ChildProcessError End

exception ConnectionError

'''
@Description:
    与连接相关问题的基类
    子类是BrokenPipeError,ConnectionAbortedError,ConnectionRefusedError和ConnectionResetError。
@Param: 
@Return: 
'''
# exception ConnectionError
'''
exception BrokenPipeError: ConnectionError的子类,试图在管道另一端关闭的情况下进行写入,或者试图写一个已经关闭写入的套接字触发 ,对应于errno EPIPE和ESHUTDOWN。
exception ConnectionAbortedError: ConnectionError的子类,当连接尝试被同伴中止时触发,对应于errno ECONNABORTED。
exception ConnectionRefusedError: ConnectionError的子类,当连接尝试被同伴拒绝时触发,对应于errno ECONNREFUSED。
exception ConnectionResetError: ConnectionError的子类,当连接被同伴重置时触发,对应于errno ECONNRESET。
'''
# exception ConnectionError End

exception FileExistsError

'''
@Description: 
    尝试创建已存在的文件或目录时触发。对应于errno EEXIST。
@Param: 
@Return: 
'''
# exception FileExistsError
import os
try:
    os.mknod("test.txt")  # test.txt已存在
except FileExistsError:
    print("exception FileExistsError Test") # exception FileExistsError Test

# exception FileExistsError  End

exception FileNotFoundError

'''
@Description:
    在请求的文件或目录不存在时触发。对应于errno ENOENT。
@Param: 
@Return: 
'''
# exception FileNotFoundError
import os
print(os.stat("./test.txt")) # test.txt已存在 获取文件属性:os.stat(file)
# os.stat_result(st_mode=33152, st_ino=131091, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=0, st_atime=1556116677, st_mtime=1556116677, st_ctime=1556116677)
try:
    os.stat("nofile.txt")
except FileNotFoundError:
    print("exception FileNotFoundError Test")   # exception FileNotFoundError Test
# exception FileNotFoundError End

exception InterruptedError

'''
@Description: 
    当系统调用被传入信号中断时触发。对应于errno EINTR。
@Param: 
@Return: 
'''
# exception InterruptedError
# exception InterruptedError End

exception IsADirectoryError

'''
@Description: 
    在目录上请求文件操作(例如os.remove())时引发。对应于errno EISDIR。
@Param: 
@Return: 
'''
# exception IsADirectoryError
import os
try:
    os.remove("./test") # 函数用来删除一个文件:os.remove()
    # 如过"./test" 不存在时会抛异常FileNotFoundError: [Errno 2] No such file or directory: './test'
except IsADirectoryError:
    print("exception IsADirectoryError Test")   # exception IsADirectoryError Test
# exception IsADirectoryError End

exception NotADirectoryError

'''
@Description: 
    在对非目录的事物请求目录操作(例如os.listdir())时引发。对应于errno ENOTDIR。
@Param: 
@Return: 
'''
# exception NotADirectoryError
import os
try:
    os.listdir("./test.txt")  # test.txt已存在
except NotADirectoryError:
    print("exception NotADirectoryError Test")  # exception NotADirectoryError Test
# exception NotADirectoryError End

exception PermissionError

'''
@Description: 
    尝试在没有足够访问权限的情况下执行操作时触发 - 例如文件系统权限。对应于errno EACCES和EPERM。
@Param: 
@Return: 
'''
# exception PermissionError
try:
    fp = open("./test.txt",mode='w')     # 直接打开一个文件   手动设置 test.txt 为 只读 
    fp.write("leacoder")  
    fp.close()
except PermissionError:
    print("exception PermissionError Test") # exception PermissionError Test
   
# exception PermissionError End

exception ProcessLookupError

'''
@Description: 
    当给定进程不存在时触发。对应于errno ESRCH。
@Param: 
@Return: 
'''
# exception ProcessLookupError
import os
import signal
try:
    os.kill(123456,signal.SIGKILL) # 注意 123456 不是已存在的进程号
except ProcessLookupError:
    print("exception ProcessLookupError Test") # exception ProcessLookupError Test

# exception ProcessLookupError End

exception TimeoutError

'''
@Description: 
    当系统功能在系统级别超时时触发
@Param: 
@Return: 
'''
# exception TimeoutError
# exception TimeoutError End

OS exceptions End

Warnings

以下异常用作警告类别;有关详细信息 https://docs.python.org/3/library/warnings.html#warning-categories

exception Warning

'''
@Description: 
    Base class for warning categories.
@Param: 
@Return: 
'''
# exception Warning
'''
Base class for warning categories.
'''
# exception Warning End

exception UserWarning

'''
@Description: 
    用户代码生成警告的基类
@Param: 
@Return: 
'''
# exception UserWarning
'''
用户代码生成警告的基类
'''
# exception UserWarning End

exception DeprecationWarning

'''
@Description: 
    弃用特性警告基类
@Param: 
@Return: 
'''
# exception DeprecationWarning
'''
弃用特性警告基类
'''
# exception DeprecationWarning End

exception PendingDeprecationWarning

'''
@Description: 
    将来会被弃用特性的警告基类
@Param: 
@Return: 
'''
# exception PendingDeprecationWarning
'''
将来会被弃用特性的警告基类
'''
# exception PendingDeprecationWarning End

exception SyntaxWarning

'''
@Description: 
    可疑句法警告基类
@Param: 
@Return: 
'''
# exception SyntaxWarning
'''
可疑句法警告基类
'''
# exception SyntaxWarning End

exception RuntimeWarning

'''
@Description: 
    可疑 Runtime 行为警告基类
@Param: 
@Return: 
'''
# exception RuntimeWarning
'''
可疑 Runtime 行为警告基类
'''
# exception RuntimeWarning End

exception FutureWarning

'''
@Description: 
    将来会改变语义结构的警告基类
@Param: 
@Return: 
'''
# exception FutureWarning
'''
将来会改变语义结构的警告基类
'''
# exception FutureWarning End

exception ImportWarning

'''
@Description: 
    可能弄错模块导入警告基类
@Param: 
@Return: 
'''
# exception ImportWarning
'''
可能弄错模块导入警告基类
'''
# exception ImportWarning End

exception UnicodeWarning

'''
@Description: 
    Unicode 相关的警告基类
@Param: 
@Return: 
'''
# exception UnicodeWarning
'''
Unicode 相关的警告基类
'''
# exception UnicodeWarning End

exception BytesWarning

'''
@Description: 
    与bytes和bytearray相关的警告的基类
@Param: 
@Return: 
'''
# exception BytesWarning
'''
与bytes和bytearray相关的警告的基类
'''
# exception BytesWarning End

exception ResourceWarning

'''
@Description: 
    与资源使用相关的警告的基类。被默认警告过滤器忽略。
@Param: 
@Return: 
'''
# exception ResourceWarning
'''
与资源使用相关的警告的基类。被默认警告过滤器忽略。
'''
# exception ResourceWarning End

Warnings End


GitHub链接: https://github.com/lichangke/LeetCode

知乎个人首页: https://www.zhihu.com/people/lichangke/

简书个人首页: https://www.jianshu.com/u/3e95c7555dc7

个人Blog: https://lichangke.github.io/

欢迎大家来一起交流学习


Comments

Content