在 Python 中,我如何将非 int 参数传递给需要 int 参数的函数并获取我自己的错误消息

In Python, how can I pass a non-int argument to a function that expects an int argument and get my own error message

提问人:rkg125 提问时间:6/23/2023 最后编辑:rkg125 更新时间:6/24/2023 访问量:70

问:

当我将不是 int 的东西传递给需要 int 的函数时,我想生成我的错误消息,而不是系统错误消息。

我尝试了各种方法来做到这一点:异常、断言、测试类型为 int 的语句,但似乎没有任何效果。我总是得到的是系统生成的“语法错误”消息

有什么方法可以覆盖系统消息或添加到其中?

我最大的希望是

def square(n):
   try:
     m=int(n)          
     return m**2
   except Exception as error:
     print(' argument to square() must be an int ' + str(error))

但即使这样也行不通。有没有办法得到我想要的东西,或者我是否必须接受系统生成的错误?

square(5z)
  File "<ipython-input-6-0a289452c433>", line 1
    square(5z)
            ^
SyntaxError: invalid syntax
python 函数 错误处理 try-except

评论

0赞 Bolong 6/23/2023
代码中存在语法错误。您不能调用 .也许你想要.square(5z)square(5 * z)
0赞 Bolong 6/23/2023
另外,请注意 Python 对缩进很敏感。ln 3 和 ln 4 必须缩进相同数量的空格。
0赞 sahasrara62 6/23/2023
尝试 pydantic ,您可以在那里定义自己的自定义错误消息并检查输入对象的类型
1赞 Tom Karzes 6/23/2023
5z不是有效的 Python 令牌,因此是语法错误。如果你有语法错误(你也不希望它这样做),你的文件甚至不会编译成字节码,所以你无法控制该错误。您可以在一定程度上控制动态错误检查,但不能控制静态错误检查。我想您可以使用 ,并将导入包装在一个语句中,如果导入失败,则给出您自己的错误,但我看不出这有多大好处。importlibtry

答:

0赞 richard 6/23/2023 #1

是什么让你认为你建议的代码不起作用?

https://onlinegdb.com/S0vbrhGpF

更常见的做法是只捕获您期望的内容,而不是每个异常情况。ValueError

评论

0赞 NotAName 6/23/2023
这不是问题的答案,它应该是评论。
0赞 rkg125 6/23/2023
@richard我之前尝试过您的建议,但是我在标准解释器中遇到了“语法错误”。你的onlineGDB是某种非标准的解释器,所以即使你得到了我想要的东西,这在标准环境中也不会发生。我认为 Tom Karzes 的答案是正确的:即不可能捕获语法错误。这就是我所怀疑的,但想由比我更了解的人来运行它。
0赞 richard 6/23/2023
我没有建议代码,它是您示例中具有常见缩进的代码。它在在线 Python 和标准 Python 安装中的行为与预期相同。您的解释器是非标准的,或者您以无效的方式调用它。
1赞 sublimeclemency 6/23/2023 #2

python 断言非常有用

def square(n):
  is_integer = isinstance(n,int)
  assert is_integer,"input must be integer"
  return m**2

或者,在一行中,

def square(n):
  assert isinstance(n,int),"input must be integer"
  return m**2

如果有帮助,请接受我的回答!

评论

0赞 rkg125 6/23/2023
我有 python 3.8.5 和 3.7.11,但在这两个版本中,您的断言版本都不会产生“输入必须是整数”消息。我总是得到语法错误。另请注意,第 3 行应返回 n**2,以便在传递 int 时起作用。
0赞 sublimeclemency 6/25/2023
好。请参阅 Assert 关键字上的 <w3schools.com/python/ref_keyword_assert.asp>。我认为您将需要Python 3.9+
0赞 Sunny Kumar 6/23/2023 #3

将参数更正为函数 Square(5)。 您甚至可以使用 assert 来覆盖系统错误。