ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

抛出错误

2019-06-13 16:54:30  阅读:288  来源: 互联网

标签:raise 错误 抛出 except foo ValueError


因为错误也是一个类,捕获一个错误就是捕获到该类的一个实例
因此,错误并不是凭空产生的,而是有意创建并抛出的
Python的内置函数会抛出很多类型的错误,自定义函数也可抛出错误

  

  自定义错误
  如果要抛出错误,首先根据需要,可以定义一个错误类,选择好继承关系,然后,用raise语句抛出一个错误的实例
  必要时可自定义错误类型,但尽量使用Python内置的错误类型

    class FooError(ValueError): #继承Python内置错误类型ValueError
        pass

    def 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 "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

 

  连续抛错误
  捕获错误目的只是记录一下,便于后续追踪,当前函数不知道应该怎么处理该错误时,就要继续往上抛,让顶层调用者去处理该错误
  若顶层调用者还无法知道如何处理时,就继续向上抛,直到错误得到正确解决,否则程序会中止

    def foo(s):
        n = int(s)
        if n==0:
            raise ValueError('invalid value: %s' % s)
        return 10 / n

    def bar():
        try:
            foo('0')
        except ValueError as e:
            print('ValueError!')
            raise    #在bar()函数中已经捕获了错误,但打印一个ValueError!后,又把错误通过raise语句抛出去了

    bar()

 

  关于raise

  raise语句如果不带参数,就会把当前错误原样抛出

    try:
        10 / 0
    except ZeroDivisionError:
        raise

  

  在except中raise一个Error,还可以把一种类型的错误转化成另一种类型
  只要是合理的转换逻辑就可以,但是,决不应该把一个IOError转换成毫不相干的ValueError

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

标签:raise,错误,抛出,except,foo,ValueError
来源: https://www.cnblogs.com/shiliye/p/11017492.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有