错误处理:
在程序运行的过程中, 如果发生了错误, 可以事先约定返回一个错误代码, 这样, 就可以知道是否有错, 以及出错的原因. 在操作系统提供的调用中, 返回错误码非常常见. 比如打开文件的函数 open() , 成功时返回文件描述符(就是一个整数), 出错时返回 -1 .
用错误码来表示是否出错十分不便, 因为函数本身应该返回的正常结果和错误码混在一起, 造成调用者必须用大量的代码来判断是否出错: 一旦出错, 还要一级一级上报, 直到某个函数可以处理该错误(比如, 给用户输出一个错误信息).
高级语言一般都有
错误 (异常) 处理机制:
- try:
- print('try...')
- r = 10 / 0
- print('result:', r)
- except ZeroDivisionError as e:
- print('except:', e)
- finally:
- print('finally...')
- print('END')
当我们认为某些代码可能会出错时, 就可以用 try 来运行这段代码, 如果执行出错, 则后续代码不会继续执行, 而是直接跳转至错误处理代码, 即 except 语句块, 执行完 except 后, 如果有 finally 语句块, 则执行 finally 语句块, 至此, 执行完毕.
一般, try 放你的工程代码, except 放你的错误处理代码, finally 放你的收尾善后代码
- try:
- print('try...')
- r = 10 / int('a')
- print('result:', r)
- except ValueError as e:
- print('ValueError:', e)
- except ZeroDivisionError as e:
- print('ZeroDivisionError:', e)
- else:
- print('no error!')
- finally:
- print('finally...')
- print('END')
异常处理的逻辑:
每异常 ----->结束
有异常 ----->
找异常处理的出口 ------>
找到一个出口就出, 后面的不看 ------>
异常处理完了, 收拾一下现场(比如关闭打开了的文件啊什么的)
Python 的错误其实也是 class, 所有的错误类型都继承自 BaseException , 所以在使用 except 时需要注意的是, 它不但捕获该类型的错误, 还把其子类也 "一网打尽". 比如:
- try:
- foo()
- except ValueError as e:
- print('ValueError')
- except UnicodeError as e:
- print('UnicodeError')
第二个 except 永远也捕获不到 UnicodeError , 因为 UnicodeError 是 ValueError 的子类, 如果有, 也被第一个 except 给捕获了.
Python 所有的错误都是从 BaseException 类派生的, 所以, 一般最后一个异常时 BaseException 的对象, 确保逮住所有的异常, 常见的错误类型和继承关系看这里:
抛出错误
python 有很多自带的错误(异常), 也可以自己定义异常, 然后再自己程序中抛出异常
- class FooError(BaseError):
- ......
- class FooError(ValueError):
- ......
用 raise
- def foo(s):
- n = int(s)
- if n==0:
- raise FooError('invalid value: %s' % s)
- return 10 / n
来自为知笔记(Wiz) http://www.wiz.cn/i/77ad7a1f
来源: http://www.bubuko.com/infodetail-3016185.html