Python ValueError 继承了自定义异常行为

Posted

技术标签:

【中文标题】Python ValueError 继承了自定义异常行为【英文标题】:Python ValueError inherited custom exception behavior 【发布时间】:2021-10-18 16:36:38 【问题描述】:

我定义我的基类Error 异常继承Exception 类, 然后我定义一个继承Error的自定义异常:

class Error(Exception):                                                                                                                           
    pass                                                                                                                                          
                                                                                                                                                  
class ValueTooSmallError(Error):                                                                                                                  
    pass                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                        
number = 10  # put a number above this                                                                                                                                  
                                                                                                                                                  
while True:                                                                                                                                       
    try:                                                                                                                                          
        i_num = int(input("Enter a number: "))                                                                                                        
        if i_num < number:                                                                                                                        
            raise ValueTooSmallError                                                                                                              
        break                                                                                                                                     
    except ValueTooSmallError:                                                                                                                    
        print("This value is too small, try again!")                                                                                              
                                                                                                                                                  
print("Ok.")

它按预期工作:

Enter a number: 1
This value is too small, try again!
Enter a number: 11
OK.

同理,ValueError异常继承Exception类,那我定义一个自定义异常继承ValueError:

class myValueError(ValueError):                                                                                                                   
    pass      
                                                                                                                               
while True:                                                                                                                                       
    try:                                                                                                                                          
        i_num = int(input("Enter a number: "))                                                                                                    
    except myValueError:                                                                                                                          
        print("this is a string, try again!")                                                                                                     
        raise myValueError                                                                                                                        
                 

但在这种情况下:

Enter a number: 4
Enter a number: "asd"
Traceback (most recent call last):
  File "test.py", line 21, in <module>
    i_num = int(input("Enter a number: "))
ValueError: invalid literal for int() with base 10: '"asd"'

为什么我看不到myValueError 打印,而我看到的是ValueError

【问题讨论】:

首先您需要捕获 ValueError,然后您可以引发 myValueError。在提出 myValueError 之前,您无法捕获它。 【参考方案1】:

在您的第二个 sn-p 中,它会引发 ValueError 异常,而不是 myValueError 异常。

【讨论】:

但这出乎意料,因为我要求提高myValueError 只有当它捕获到myValueError 时,您才要求它提高myValueError。我认为您想要的是在捕获ValueError 时提高myValueError。尝试将 except myValueError: 更改为 except ValueError: 看看这是否是您所期望的行为。 我做到了。现在它可以工作并且 myValueError 被 raised,但是我不明白如何 catch

以上是关于Python ValueError 继承了自定义异常行为的主要内容,如果未能解决你的问题,请参考以下文章

如何确定“ValueError:元素不能位于父视图中”的原因? - Odoo 10.0e企业

python自定义异常抛出接受多个数值

如何在 keras lambda 层中使用 tf.py_func 来包装 python 代码。 ValueError:应定义 Dense 输入的最后一个维度。没有找到

理解 ValueError:python 中的“无效数字”

在 Tensorflow 中实现自定义损失函数会导致“ValueError:必须在循环之前定义‘输出’。”

SWIG 和 Python3 导入错误