Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,检查错误消息作为流控制的一种形式是一种很好的做法吗?_Python_Python 3.x - Fatal编程技术网

在Python中,检查错误消息作为流控制的一种形式是一种很好的做法吗?

在Python中,检查错误消息作为流控制的一种形式是一种很好的做法吗?,python,python-3.x,Python,Python 3.x,我的代码正在处理以.0结尾的字符串形式包含整数值的数据文件。例如,1234是“1234.0”。这些字符串应转换为整数,这非常简单,首先转换为浮点,然后再转换为整数: foo = "1234.0" foo = int(float(foo)) 但是,字符串可能是“nan”,在这种情况下,此代码在转换为int时会抛出错误: ValueError:无法将浮点NaN转换为整数 这些值应更改为“无”。我认为有两种处理方法: foo = "nan" try: foo = int(float(foo)

我的代码正在处理以.0结尾的字符串形式包含整数值的数据文件。例如,
1234
“1234.0”
。这些字符串应转换为整数,这非常简单,首先转换为浮点,然后再转换为整数:

foo = "1234.0"
foo = int(float(foo))
但是,字符串可能是
“nan”
,在这种情况下,此代码在转换为int时会抛出错误:

ValueError:无法将浮点NaN转换为整数

这些值应更改为“无”。我认为有两种处理方法:

foo = "nan"
try:
    foo = int(float(foo))
except ValueError as e:
    if 'cannot convert float NaN to integer' in str(e):
        foo = None
    else:
        raise

在Python中,这被认为是一个很好的实践,我通常会倾向于第一个选项。然而,这种将异常消息作为流控制来显式检查异常消息的方法(即,如果该消息以其他方式出现,则执行此操作)直观上感觉是“脏的”


在Python中,检查特定的错误消息作为流控制的一种形式通常被认为是好的还是坏的做法?为什么?

这是坏的做法,因为它将代码与语言文档中未指定的确切错误消息紧密地结合在一起。如果Python的新版本稍微更改了此错误消息,代码将中断

如果希望以不同于非整数数字字符串的方式处理非数字字符串,则应分别捕获异常:

def str_至_int:
尝试:
浮点数=浮点数
除值错误外:
打印('不是浮点')
提升
其他:
尝试:
返回整数(浮点值)
除值错误外:
打印('不是整型')
一无所获

这是一种不好的做法,因为它将代码与语言文档中未指定的确切错误消息紧密地结合在一起。如果Python的新版本稍微更改了此错误消息,代码将中断

如果希望以不同于非整数数字字符串的方式处理非数字字符串,则应分别捕获异常:

def str_至_int:
尝试:
浮点数=浮点数
除值错误外:
打印('不是浮点')
提升
其他:
尝试:
返回整数(浮点值)
除值错误外:
打印('不是整型')
一无所获

通常,您应该验证您的输入。避免尝试投下你不知道是什么的东西。也就是说,如果您知道输入的样子(以.0结尾的整数或“nan”),那么您应该验证它。例如:

import re
from typing import Optional


def validate(maybe_number: str) -> Optional[int]:
    # following regex matches string with at least one digit followed by '.0'
    number_pattern = re.compile(r"^\d+\.0$")

    if number_pattern.match(maybe_number):
        return int(maybe_number)

    if maybe_number == "nan":
        return None

    raise ValueError("some useful message")

通常,您应该验证您的输入。避免尝试投下你不知道是什么的东西。也就是说,如果您知道输入的样子(以.0结尾的整数或“nan”),那么您应该验证它。例如:

import re
from typing import Optional


def validate(maybe_number: str) -> Optional[int]:
    # following regex matches string with at least one digit followed by '.0'
    number_pattern = re.compile(r"^\d+\.0$")

    if number_pattern.match(maybe_number):
        return int(maybe_number)

    if maybe_number == "nan":
        return None

    raise ValueError("some useful message")

不是特别好或坏。我认为,通常情况下,如果异常很少出现(异常),则使用异常,否则使用if-else语句。如果您需要国际化您的应用程序,例如在错误中支持西班牙语或法语,这将非常有趣message@ChatterOne,说得很对,尽管在我的特殊情况下,我可以百分之百肯定地说,我们永远不会使用英语以外的语言。可能与寻求此问题答案的其他人非常相关。@OP您希望您的具体案例得到回答,还是更喜欢一般性答案(根据您的问题标题),其中代码作为示例。因为这两者可能非常不同,不是特别好,也不是特别坏。我认为,通常情况下,如果异常很少出现(异常),则使用异常,否则使用if-else语句。如果您需要国际化您的应用程序,例如在错误中支持西班牙语或法语,这将非常有趣message@ChatterOne,说得很对,尽管在我的特殊情况下,我可以百分之百肯定地说,我们永远不会使用英语以外的语言。可能与寻求此问题答案的其他人非常相关。@OP您希望您的具体案例得到回答,还是更喜欢一般性答案(根据您的问题标题),其中代码作为示例。因为这两种说法可能有很大的不同。你能为你的答案提供一个参考吗?@DanielLima你认为哪种说法需要一个参考来支持?谢谢你的回答。我认为您的代码片段遗漏了一个关键问题,即我只希望在字符串为“nan”的情况下不返回任何内容。使用此代码,将不会返回任何值错误(如果字符串的值被设置为“猴子”),而我真的希望看到在结果中出现了一个错误,即我们的数据文件包含任何意想不到的值,因此我们可以逐个地考虑它。有更好的方法吗?@DuckHuntDuo当然,您可以更改
return None
语句中的一个或两个,以执行您想要的任何操作。关键是,通过单独捕获它们,您可以单独处理它们。我已经编辑以显示这一点;如果您在捕获和重新提升第一个
ValueError
之间不需要做任何事情,那么您可以完全摆脱外部
try
块。您能为您的答案提供参考吗?@DanielLima您认为哪种说法需要参考支持?谢谢您的回答。我认为您的代码片段遗漏了一个关键问题,即我只希望在字符串为“nan”的情况下不返回任何内容。使用此代码,将不会返回任何值错误(如果字符串的值被设置为“猴子”),而我真的希望看到在结果中出现了一个错误,即我们的数据文件包含任何意想不到的值,因此我们可以逐个地考虑它。有更好的方法吗?@DuckHuntDuo当然,您可以更改一个或两个
返回None