美文网首页
错误处理

错误处理

作者: 噜噜迅儿 | 来源:发表于2018-05-24 22:01 被阅读0次
    try:
        print('try...')
        r = 10 / int('2')
        print('result:', r)
    except ValueError as e:
        print('ValueError:', e)
    except ZeroDivisionError as e:  ## 如果发生了不同类型的错误,应该由不同的except语句块处理。没错,可以有多个except来捕获不同类型的错误:
        print('ZeroDivisionError:', e)
    else:  ## 当没有错误发生时,会自动执行else语句:
        print('no error!')
    finally:  ## 不管有没有错误发生,都会执行finally
        print('finally...')
    print('END')
    
    ## 测试
    try...
    result: 5.0
    no error!
    finally...
    

    记录错误

    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')
    
    ## 测试
    $ python3 err_logging.py
    ERROR:root:division by zero
    Traceback (most recent call last):
      File "err_logging.py", line 13, in main
        bar('0')
      File "err_logging.py", line 9, in bar
        return foo(s) * 2
      File "err_logging.py", line 6, in foo
        return 10 / int(s)
    ZeroDivisionError: division by zero
    END
    

    抛出错误

    如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:

    # err_raise.py
    class FooError(ValueError):
        pass
    
    def foo(s):
        n = int(s)
        if n==0:
            raise FooError('invalid value: %s' % s)
        return 10 / n
    
    foo('0')
    
    ## 测试
    $ python3 err_raise.py 
    Traceback (most recent call last):
      File "err_throw.py", line 11, in <module>
        foo('0')
      File "err_throw.py", line 8, in foo
        raise FooError('invalid value: %s' % s)
    __main__.FooError: invalid value: 0
    

    只有在必要的时候才定义我们自己的错误类型。如果可以选择Python已有的内置的错误类型(比如ValueErrorTypeError),尽量使用Python内置的错误类型。

    raise语句如果不带参数,就会把当前错误原样抛出。此外,在exceptraise一个Error,还可以把一种类型的错误转化成另一种类型:

    try:
        10 / 0
    except ZeroDivisionError:
        raise ValueError('input error!')
    

    只要是合理的转换逻辑就可以,但是,决不应该把一个IOError转换成毫不相干的ValueError

    相关文章

      网友评论

          本文标题:错误处理

          本文链接:https://www.haomeiwen.com/subject/nbdejftx.html