python函数异常返回 python异常处理方法

python运行错误怎么办?一、python的错误处理:
在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错以及出错的原因 。
在操作系统提供的调用中,返回错误码非常常见 。比如打开文件的函数open() , 成功时返回文件的描述符(就是一个整数),出错时返回-1用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结果和错误码混在一起 , 造成调用者必须大量的代码来判断是否出错:def foo():
r = somefunction()if r == (-1):return (-1)return rdef bar():
r = foo()if r == (-1):print("Error")else:pass一旦出错,还要一级一级上报,直到某个函数可以处理该错误(比如 , 给用户输出一个错误信息)
所以,高级语言通常都内置了一套try...except...finally...的错误处理机制,python也不例外 。try
让我们用一个例子来看看try的机制try:print("try....")
r = 10 / 0print("result", r)except ZeroDivisionError as e:print("except:", e)finally:print("finally...")print("END....")
当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行
而是直接跳转至错误处理代码,即except语句块
执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕 。
上面的代码在计算10 / 0时 会产生一个除法运算错误:try....except: division by zerofinally...
END....从输出可以看到,当错误发生时 , 后续语句print("result:", r)不会被执行,except由于捕获到ZeroDivisionError因此被执行 。
最后 , finally语句被执行 。然后,程序继续按照流程往下走 。
如果把除数0 变成2,则执行结果如下try....
result 5.0finally...
END....由于没有错误发生 , 所以except语句块不会被执行,但是finally如果有则一定会被执行,当然finally也可以没有
你还可以猜测 , 错误应该有很多种类,日过发生了不同类型的错误 , 应该由不同的except语句块处理 。
没错,可以有多个except来捕获不同类型的错误:try:print("try.....")
r = 10 / int("a")print("result:", r)except ValueError as e:print("ValueError:", e)except ZeroDivisionError as e:print("ZeroDivisionError:", e)finally:print("finally...")print("END...")
int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError , 用另一个except捕获ZeroDivisionError
此外 , 如果没有错误发生,可以再except语句块后面加一个else , 当没有错误发生时 , 会自动执行else语句 。try:print("try...")
r = 10 / int("2")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类派生的 。
所有常见的错误类型和继承关系看这里:
使用try...exccept捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用foo()
foo()调用bar(),结果bar()出错了,这时 , 只要main()捕获到了,就可以处理:def foo(s):return 10 / int(s)def bar(s):return foo(s) * 2def main():try:

推荐阅读