python函数异常 python中异常值处理( 三 )


logging.exception(e)
main()print("END")
输出结果为:
ERROR:root:division by zero
Traceback (most recent call last):
File "C:/Python36/test.py", line 12, in main
bar("0")
File "C:/Python36/test.py", line 8, in barreturn foo(s) * 2
File "C:/Python36/test.py", line 5, in fooreturn 10 / int(s)
ZeroDivisionError: division by zero
END
同样是出错 , 但程序打印完错误信息后会继续执行 , 并正常退出 。
通过配置,logging还可以把错误记录到日志文件里,方便事后排查 。
四、抛出错误
因为错误是class,捕获一个错误就是捕获到该class的一个实例 。
因此,错误并不是凭空产生的,而是有意创建并抛出的 。
python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误 。
如果要抛出错误,首先根据需要 , 可以定义一个错误的class , 选择好继承关系 , 然后用raise语句抛出一个错误的实例:class FooError(ValueError):passdef foo(s):
n =int(s)if n == 0:raise FooError("invalid value: %s" % s)return 10 / n
foo("0")
输出结果:
Traceback (most recent call last):
File "C:/Python36/test.py", line 10, in module
foo("0")
File "C:/Python36/test.py", line 7, in fooraise FooError("invalid value: %s" % s)
FooError: invalid value: 0
只有在必要的时候才定义我们自己的错误类型 。
如果可以选择python已有的内置错误类型(比如ValueError, TypeError),尽量使用python内置的错误类型 。
最后,我们来看另一种错误处理方式:def foo(s):
n = int(s)if n == 0:raise ValueError("invalid value: %s" % s)return 10 / ndef bar():try:
foo("0")except ValueError as e:print("ValieError")raisebar()
在bar()函数中,我们明明已经捕获了错误,但是,打印一个ValueError之后
又通过raise语句抛出去了 。这不是有病吗
其实,这种错误处理方式不但没病,而且相当常见 。
捕获错误目的只是记录一下,便于或许追踪 。
但是,由于当前函数不知道应该怎么处理该错误,所以 , 最恰当的方式是继续往上抛,让顶层调用者去处理 。
好比一个员工处理不了一个问题时,就把问题一直往上抛,最终会抛给CEO去解决 。
注意:raise语句如果不带参数,就会把当前错误原样抛出 。
此外,在except中raise一个Error , 还可以改写错误类型try:10 / 0except ZeroDivisionError:raise ValueError("do not input zero!")
输出结果:
Traceback (most recent call last):
File "C:/Python36/test.py", line 4, in moduleraise ValueError("do not input zero!")
ValueError: do not input zero!只要是合理的转换逻辑就可以,但是,绝不应该把一个IOError转成毫不相干的valueError.
总结:
python内置的 try...except...finally 用来处理错误十分方便 。
出错时 , 会分析错误信息并定位错误发生的代码位置才是关键的 。
程序也可以主动抛出错误,让调用者来处理相应的错误 。
但是应该在文档中写清楚可能会抛出哪些错误,以及错误产生的原因 。
python中try/except函数可以用什么函数代替python中try...except函数可以用if..else函数代替 。在while循环内部,fast指针每次向前走两步,这时候我们就要判断fast的next指针是否为None , 不然对fast.next再调用next指针的时候就会报异常,这个异常出现也反过来说明链表不存在环,就可以returnFalse 。所以可以把while代码放到一个try…except中,一旦出现异常就return 。这是一个比较好的思路,在以后写代码的时候可以考虑替换某些if…else语句减少不必要的判断,也使得代码变的更简洁 。

推荐阅读