zoukankan      html  css  js  c++  java
  • 抛出错误

    因为错误也是一个类,捕获一个错误就是捕获到该类的一个实例
    因此,错误并不是凭空产生的,而是有意创建并抛出的
    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!')
  • 相关阅读:
    博客园.netCore+阿里云服务器升级中会报的一个错误
    框架资料整理
    免费在线作图,实时协作-工具
    ubuntu14.04 配置网络
    vagrant的学习 之 基础学习
    mysql 定时任务
    linux 命令练习 2018-08-27
    一点一滴(一)
    Thinkphp5.0 的实践一
    Thinkphp5.0 的使用模型Model的获取器与修改器
  • 原文地址:https://www.cnblogs.com/shiliye/p/11017492.html
Copyright © 2011-2022 走看看