Python之异常处理
序言:异常不可能避免
未实现和为实现异常:
NotImplemented:未实现;是个单值,NotImplementedType类的实例
源码:NotImplemented = None # (!) real value is ''
NotImplementedError:是个类,异常类,返回type
错误和异常概念:
*异常是可以捕获、并被处理的
*错误是不可能被捕获的
一个健壮的程序:尽可能的避免错误;同时尽可能的捕获、处理各种异常;
异常的产生:
*raise 语句显式的抛出异常
raise 本身就是一个异常,抛出运行时异常。
raise 后面给出异常类,如果没有参数,会进行无参构造,只有 raise 会进行无参构造
raise 后要求应该是BaseException类的子类或实例,如果是类,将被无参实例化
*Python解释器自己检测到异常并引发它
异常捕获的原则:
*从小到大,从具体到宽泛(先具体捕获,最后才宽泛捕获)
异常的捕获定义:
try:
待捕获异常的代码块
except [异常类型]:
异常的处理代码块
代码示例:
try:
# pass # 如果是pass就没有异常
raise IndexError
except: # 捕获异常处理
print('one')
BaseException 及子类:
BaseException:所有内建异常类的基类
示例代码:
import sys
try:
sys.exit(100)
except SystemExit:
print('Sysexit')
print('outre')
Exception 及子类:
Exception是所有内建的、非系统退出的异常的基类,自定义异常应该继承自它
示例代码:
class MyException(Exception):
pass
try:
1/0
raise MyException()
except MyException:
print('catch the MyExcetpion')
except ZeroDivisionError:
print('ZeroDivisionError')
except Exception:
print('Exception')
as 子句:
*被抛出的异常,应该是异常的实例对象,使用as子句可以获取这个对象
示例代码:
class MyException(Exception):
def __init__(self, code, message):
self.code = code
self.message = message
try:
# 1/0
# raise MyException() # MyException实例需要2个参数,否则MyException实例化时就抛出一个异常
raise MyException(22, 'job')
except MyException as ob:
print('catch the MyExcetpion', ob.args, ob.code)
except ZeroDivisionError as ob:
print('ZeroDivisionError', ob)
except Exception as ob:
print('Exception', ob)
finally 子句:
*finally;最后一定要执行的,并且不管是否发生了异常,都要执行finally的部分。
示例代码:
class MyException(Exception):
def __init__(self, code, message):
self.code = code
self.message = message
try:
# 1/0
raise MyException(22, 'job')
except MyException as ob:
print('catch the MyExcetpion', ob.args, ob.code)
except ZeroDivisionError as ob:
print('ZeroDivisionError', ob)
except Exception as ob:
print('Exception', ob)
finally:
print('-----end-----')
异常总结:
*异常总是向外层抛出,如果外层没有处理这个异常,就会继续向外抛出
**如果内层捕获并处理了异常,外部就不能捕获到了
**如果到了最外层还是没有被处理,就会中断异常所在的线程的执行