【问题标题】:Differ between type errors类型错误之间的区别
【发布时间】:2021-08-30 11:43:42
【问题描述】:

我有一个函数说:

def foo(a, b, c):
  ...

由于缺少以下参数,我可以处理 TypeError:

try:
  foo(1, 2)
except TypeError:
  print("Arguments are not ok.")

类型错误可能有多种原因,例如:

  • 参数过多
  • 缺少参数
  • 等

这里的问题是我想知道错误是由于提供的参数少还是提供的参数太多而引发的。

是的,我可以使用 if 语句检查错误消息的内容,但这似乎效率低下。有没有更好的方法并且可能更有效?

【问题讨论】:

  • 你会以编程方式处理这些信息......?

标签: python exception error-handling


【解决方案1】:

我能够找到解决方法:

import inspect

def foo(x, y, z):
   ...

args = (1, 2)
try:
  foo(*args)
except TypeError:
  fooargs = inspect.getfullargspec(foo).args

  if len(fooargs) > len(args):
    print('Less arguments passed')

  elif len(fooargs) < len(args):
    print('Too many arguments passed')

【讨论】:

    【解决方案2】:

    你可以给每个参数一个默认值并检查它,还可以添加一个包罗万象

    def foo(a=None, b=None, c=None, *_too_much):
        if a == None:
            pass  # argument-checks here
        ...
        if _too_much:
            pass  # Too many arguments handling here
    

    不过,您的用例是什么?更详细地处理交互使用或其他的使用错误?如果您的用户没有专门在 REPL 或其他内容中使用它,那么可能有更好的方法来做您想做的事情。

    【讨论】:

    • 似乎很疯狂地重新发明 Python 已经在自己处理的错误处理......
    【解决方案3】:

    不确定这背后的意图是什么,因为异常处理给出了失败的明确原因。但是,如果您需要这样做,那么这可能对您有用:

    try:
        # Call to the function
    except TypeError as ex:
        if (re.search(r"missing.*positional argument", str(ex))):
            print ("Less no. of arguments passed")
        elif (re.search(r".*takes\s*\d+.*but.*were given", str(ex))):
            print ("Too many arguments passed")
        else:
            print ("Another error")
    

    【讨论】:

      猜你喜欢
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2016-09-28
      • 2013-11-17
      • 2019-03-07
      • 2012-07-14
      • 2014-06-24
      相关资源
      最近更新 更多