Python的异常处理机制
1.错误和异常
错误 指的是代码的语法或者逻辑有错误
异常 指的是 由错误引起的,当出现错误,python解释器就无法处理程序,报出异常
出现异常,程序终止执行,如果不加以处理(异常捕捉),就会出现所谓的traceback 回溯 终止程序
2.python的异常处理
使用 python 异常处理机制,遇见异常,不会抛出不友好的traceback,而是有except决定抛出的信息
python的错误处理机制让你能够细致的控制与用户分享错误信息的程度,要分享多少信息由你决定。
1.try/except
def main(): a=3/0 print(a) try: main() except ZeroDivisionError: print("error")
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理,如果没有try/except,程序发生错误会终止运行,且抛出不友好的traceback,有了该语句,try语句发生错误,只会打印出“error”提示。
except捕捉 ZeroDivisionError 异常,也可以捕捉多种异常 except(Exception1[, Exception2[,...ExceptionN]]]):
except也可以不带任何异常类型,意味着只要try有错,就执行except后面的语句,但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。
def main():
a=3/0
print(a)
try:
main()
except:
print("error")
2.try/except/else/finally
def main():
a=3/1
print(a)
try:
main()
except ZeroDivisionError:
print("error")
else:
print(main())
finally:
print("always do this")
try语句内容有错,执行except语句,没有错误,执行else语句
3. 抛出异常 raise
python使用raise 语句 抛出一个指定的异常
raise NameError(“hello”)
有了raise 语句 就有异常,不管程序有没有异常,raise出现的地方就是异常
def is_work_done(): a=3/1 return a try: is_work_done() raise NameError("HELLO") except: print("hello") raise #raise的唯一参数是异常的类或者实例(也就是exception的子类)
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
4 . 自定义异常类型
你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:
class MyError(Exception): def __init__(self,value): super().__init__() self.value=value try: raise MyError(9) except MyError as e: print(e.value)
5. Exception 和 BaseException区别
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration...
+-- StandardError...
+-- Warning...
可以看出 BaseException 是最最基础的异常类,Exception 继承他,BaseException
除了包含所有的Exception
外还包含了SystemExit
,KeyboardInterrupt
和GeneratorExit
三个异常。这三个高级异常很少使用,我们在处理常见异常,只需要基于Exception即可。
6. except Exception as e和 except Exception, e
两者意思相同 第一种写法推荐使用,第二种 python3 不支持
7. 常见的异常类型
描述 | |
BaseError | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyBoardInterrupt | 用户中断执行(ctrl+c) |
Exception | 常规错误的基类 |
AssertionError | 断句错误,当assert关键字后面的条件为假时,程序就会抛出 |
FileNotFoundError | 文件不存在 |
AttributeError | 属性错误,对象属性不存在的时候 |
IndexError | 索引错误,索引超出范围 |
KeyError | 在字典中查找一个不存在的关键字 |
NameError | 尝试访问一个不存在的变量 |
SyntaxError | 语法错误 |
TypeError | 类型错误,不同类型间的无效操作,1+“1” |
ZeroDivisionError | 除0错误,分母为0 |
EOFError | 没有内建输入,到达EOF标记 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
RuntimeError | 一般的运行时错误 |
IndentationError | 缩进错误 |
SystemError | 一般的解释器错误 |
TabError |
Tab和空格混用 |
Warning |
所有警告的基类 |
8. 注意事项
- 只处理你知道的异常,避免捕获所有异常然后吞掉它们。
- 抛出的异常应该说明原因
- 如果有需要,切记使用
finally
来释放资源 - 如果有需要,请不要忘记在处理异常后做清理工作或者回滚操作