Python异常的处理记录

参考资料来至:PythonCookbook

首先要知道,所有的异常事一个类。

如果一个单独的代码块处理所有不同的异常,可以将它们归组到一个元祖中。

from urllib.error import URLError

try:
    object.get_url(url)
except (URLError, ValueError, SocketTimeout):
    object.remove_url(url)

 这个错误元祖(URLError, ValueError, SocketTimeout)捕获到都会执行object.remove_url(url)

如果对一个单独的采取不同的处理方法,可以将其放入一个单独的except中

try:
    object.get_url(url)
except (URLError, ValueError):
    object.remove_url(url)
except SocketTimeout:
    object.other_do(url)

有许多归组为继承体系,对于这样的异常,可以通过指定一个基类来捕获所有异常。

try:
    f = open('a.txt')
except (FileNotFoundError, PermissionError):
    ...

try:
    f = open('a.txt')
except OSError:
    ...
# 查下此类下面的子类
print(OSError.__subclasses__())
print()
# 查看继承表 print(FileNotFoundError.__mro__)
[<class 'ConnectionError'>, <class 'BlockingIOError'>, <class 'ChildProcessError'>, <class 'FileExistsError'>, 
<class 'FileNotFoundError'>, <class 'IsADirectoryError'>, <class 'NotADirectoryError'>, <class 'InterruptedError'>,
<class 'PermissionError'>, <class 'ProcessLookupError'>, <class 'TimeoutError'>, <class 'io.UnsupportedOperation'>, <class 'signal.ItimerError'>] (<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)

 书中不严谨的地方事,明显OSError包含的错误类型更加多。

我们还可以通过as e,这个e就是捕获到错误的实例,实例的话就应该有一堆属性,你也可以通过type(e)的方式查看e的类型,便于精准捕获。

其中的error属性可以捕获到错误的代码。

except向下执行捕获到合适的异常,下面的except就不会执行。

try:
    f = open('a.txt')
except OSError as e:
   print(dir(e)) print('OSError') # 这个肯定不会执行,应该OSError是FileNotFoundError的父类,它把包含它的所有异常都捕获了 except FileNotFoundError: print('FileNotFoundError')

下面上一下OSError对象的属性

['__cause__', '__class__', '__context__', '__delattr__', '__dict__', 
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__',
'__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']

捕获所有的异常

try:
    ...
# 一般错误这个够用了
except Exception as e:
    ...
# 这个是错误的祖宗
except BaseException as e:
    ...

 除了SystemExit,KeyboardInterrupt,和GeneratorExit之外,Exception都能捕获

猜你喜欢

转载自www.cnblogs.com/sidianok/p/12229828.html