【问题标题】:try and except code block in python to raise error for missing argument尝试并在 python 中排除代码块以引发缺少参数的错误
【发布时间】:2021-09-28 01:11:07
【问题描述】:

所以我试图在我的代码中实现基本的 try 和 except 逻辑,以便在读取命令行参数时读取和处理异常:

我已经能够做到这一点。但我想在抛出错误时明确说明缺少第一个或第二个参数。

这是我的代码。

import sys
import logging

try:
    job_name = sys.argv[1]
    odate = sys.argv[2]
except IndexError as err:
    print('OS error: {0}'.format(err))
else:
    print('Correct arguments were provided')

如何产生错误让用户知道缺少哪个 arg?

【问题讨论】:

  • 我会在使用之前验证sys.argv 的长度是否合适,但作为一种不是很复杂的通用技术,您可以将job_nameodate 设置为None 和在 except 块中检查它们 - 无论哪个仍然是 None 都是导致异常的原因。
  • 如果您只收到一个参数,则无法知道缺少哪个参数。也许用户忘记提供job_name。也许他们忘记提供odate。也许他们不小心完全运行了错误的程序,并且提供的参数不应该是这些参数中的任何一个。也许他们确实提供了两个参数,但不小心点击了b 而不是空格键,这些参数最终成为一个参数。
  • 假设我尝试像foo.py hax 一样运行你的程序。我打算让hax 成为工作名称还是日期? 你怎么知道

标签: python python-3.x args try-except


【解决方案1】:

异常IndexError 不包括导致错误的访问索引,您可以通过traceback.format_exc()sys.exc_info() 或其他方式检查堆栈回溯,以捕获访问的索引,但这太复杂了。

替代方案 1

首先检查参数的长度是否正确并采取相应措施:

ARG_COUNT = 2
assert len(sys.argv) == ARG_COUNT + 1

# No more need of try-except block
job_name = sys.argv[1]
odate = sys.argv[2]

替代方案 2

这是最好的解决方案。请改用argparse。它处理您需要的行为。您还可以进一步自定义每个参数的设置,例如指定参数的预期数据类型。

import argparse

parser = argparse.ArgumentParser(description='Process some inputs.')
parser.add_argument('job_name')
parser.add_argument('odate')
args = parser.parse_args()
print(args, args.job_name, args.odate)

输出

$ python script.py 
usage: script.py [-h] job_name odate
script.py: error: the following arguments are required: job_name, odate
$ python script.py some
usage: script.py [-h] job_name odate
script.py: error: the following arguments are required: odate
$ python script.py some thing
Namespace(job_name='some', odate='thing') some thing

【讨论】:

  • Godfrey Pociano 提供了对这些替代方案的详尽解释,我是 python 新手,非常感谢你的这种姿态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多