错误处理:
码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的 调用中,返回错误码非常常见。比如打开文件的函数 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')
异常处理的逻辑:
每异常----->结束
有异常----->
找异常处理的出口------>
找到一个出口就出,后面的不看 ------>
异常处理完了,收拾一下现场(比如关闭打开了的文件啊什么的)
所以在使用 except 时需要注意的是,它不但捕获该类型的错误,还把其 子类也“一网打尽”。比如:
try:
foo()
except ValueError as e:
print('ValueError')
except UnicodeError as e:
print('UnicodeError')
ValueError 的子类,如果有,也被第一个 except 给捕获了。
抛出错误
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