【Python】Python语法基础——异常处理机制 try...except...finally...

异常处理机制有什么用?

我们在设计程序时,肯定希望程序是鲁棒的健壮的,在运行时能够不出或者少出问题。但是,在实际运行中,总会有一些因素可能导致 程序无法正常运行

所谓异常处理机制,就是提供了对错误异常的处理手段:当程序出错时,程序不是立刻报错终止,你可以根据异常类型进行相应的处理,同时,程序可以继续运行下去。

通常高级语言都内置了异常处理机制,像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中的异常处理

你可能感兴趣的:(Python)