类型不正确时引发 TypeError

Posted

技术标签:

【中文标题】类型不正确时引发 TypeError【英文标题】:Raising TypeError when type is not correct 【发布时间】:2022-01-18 20:08:56 【问题描述】:

我想调用函数foo(a, b, c),其中参数可以是intfloat 这些参数用户输入使用space 作为分隔符。 例如:1 8 9

同时,用户不仅可以输入数字,还可以输入一些错字,例如: 1 8k 9。 在这种情况下,我应该提出 TypeError 并输入错误元素的数量

a, b, c = map(int, input().split())

for i, key in enumerate([a, b, c]):
   if not isinstance(key, (int, float)):
       raise TypeError(
           f'The type of i + 1 element is incorrect')
foo(float(a), float(b), float(c))

在我的代码中出现下一个错误:我无法将k8 写入int 变量。

1 k8 5
Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\digits\main.py", line 40, in <module>
    a, b, c = map(int, input().split())
ValueError: invalid literal for int() with base 10: 'k8'

当用户输入k8 时如何引发 TypeError? 如果用户输入k8 9 5h,情况如何?在这种情况下,我需要使用消息 The type of 1, 3 element is incorrect 引发 TypeError

【问题讨论】:

那么你必须在这行之前检查输入是否可以转换为float或int:a, b, c = map(int, input().split()) 如果允许浮动,为什么要使用map(int, ...) 【参考方案1】:

应该这样做:

args = input().split()

f_args = []
errors = []
for i, arg in enumerate(args, 1):
    try:
        f_args.append(float(arg))
    except ValueError:
        errors.append(str(i))
if errors:
    raise TypeError(f"The type of ', '.join(errors) element is incorrect")

foo(*f_args)

【讨论】:

谢谢!如果三个输入中有两个不正确,例如5 9k 6j,我该如何输入错误消息The type of 2, 3 element is incorrect 那么您需要将i 值累积到一个列表中,而不是立即提高TypeError,以便在最后引发错误。让我解决这个问题。 谢谢你,@Samwise 它对我来说很好用!需要时间来理解它,但我会的:) 嗨,@Samwise!也许你可以帮助我:我需要使用任何参数调用foo,即用户输入。但是如果参数包含像8k 这样的符号,我需要在我的foo 函数中提高TypeError,而不是在它之前 只要把上面的逻辑放到你的foo函数里面。

以上是关于类型不正确时引发 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

不能正确引发异常的 PLSQL 函数

scala强制转换不兼容类型而不会引发错误

Emgu.CV.CvInvoke”的类型初始值设定项引发异常

由客户端不视为相同类型的 Web 服务引发的自定义异常(使用共享程序集)

firebase changePassword 不会因旧密码不正确而引发错误

高阶函数&异常处理