我们在设计程序时,肯定希望程序是鲁棒的健壮的,在运行时能够不出或者少出问题。但是,在实际运行中,总会有一些因素可能导致 程序无法正常运行。
所谓异常处理机制,就是提供了对错误异常的处理手段:当程序出错时,程序不是立刻报错终止,你可以根据异常类型进行相应的处理,同时,程序可以继续运行下去。
通常高级语言都内置了异常处理机制,像Java,Python也不例外,内置了一套try...except...finally...
的异常处理机制。
try...except...finally...
的工作机制当我们认为某些代码可能会出错时,就可以用try
来运行这段代码。
try
部分。try
的代码如果中途执行出错,则它后续的代码不会继续执行,直接 抛出异常 给except
处理。except
部分。except
的作用是捕获异常和处理异常。except
后需要指定一个异常类型,有多种异常的情况下,可以有多个except
来捕获不同类型的异常。finally
部分。最后如果有finally
,则执行finally
中的代码。示例代码
def div(a, b):
try:
print(a / b)
except ZeroDivisionError:
print("Error: b should not be 0 !!")
except Exception as e:
print("Unexpected Error: {}".format(e))
else:
print('Run into else only when everything goes well')
finally:
print('Always run into finally block.')
# tests
div(2, 0)
div(2, 'bad type')
div(1, 2)
# Mutiple exception in one line
try:
print(a / b)
except (ZeroDivisionError, TypeError) as e:
print(e)
# Except block is optional when there is finally
try:
open(database)
finally:
close(database)
# catch all errors and log it
try:
do_work()
except:
# get detail from logging module
logging.exception('Exception caught!')
# get detail from sys.exc_info() method
error_type, error_value, trace_back = sys.exc_info()
print(error_value)
raise
总结
except
语句不是必须的,finally
语句也不是必须的,但是二者必须要有一个,否则就没有try
的意义了。except
语句可以有多个,Python会按except
语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except
语句。except
语句可以以元组形式同时指定多个异常,参见实例代码。except
语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging
或者sys
模块获取当前异常。raise
,后面不要带任何参数或信息。try/except
语句,比如with
语句,getattr()
方法。https://docs.python.org/3/library/exceptions.html#exception-hierarchy
Python内置的logging
模块可以非常容易地记录错误信息:
# err_logging.py
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END')
参考:
异常处理机制_百度百科
错误处理 - 廖雪峰的官方网站
总结:Python中的异常处理