错误处理但仍然得到ValueError

时间:2017-08-08 16:10:25

标签: python string error-handling

我正在尝试解决有关错误处理的这一挑战。也许我离开了!

挑战描述:

  

编写一个名为" load_file"的函数。接受一个参数:文件名。该函数应该打开文件并返回内容。

     

如果文件的内容可以解释为整数,则将内容作为整数返回。否则,如果文件的内容可以解释为float,则将内容作为float返回。否则,将文件的内容作为字符串返回。

     

您可以假设该文件只有一行。

我得到ValueError:无法将字符串转换为float:" b> a!\ {\'"

错误处理我错了吗?

def load_file(file):

    file = open(file, "r")
    all_lines = file.read()

    try:        
        return int(all_lines)

    except ValueError:
        return float(all_lines)

    else:
        return all_lines


    file.close()

4 个答案:

答案 0 :(得分:2)

您需要执行类似

的操作
with open(file, "r") as file_handle:
    all_lines = file.read()
    try:
        return int(all_lines)
    except ValueError:
        pass
    try:
        return float(all_lines)
    except ValueError:
        pass

    return all_lines

重点是你根本不关心错误,因为它们只是意味着你需要继续下一个选项。

我还要指出with构造负责为您关闭文件。如果您想file = open(file, "r"),则需要将返回值存储到变量中,然后在file.close()之前执行return

答案 1 :(得分:1)

您使用ValueError函数处理引发的int(),但float()也可能抛出此类错误。 try/catch structure的目的是在try块中运行可能抛出任何异常的代码,例如ValueError,并执行"错误处理程序" except块内的代码。

答案 2 :(得分:1)

当你尝试解析为float时,也有一个例外。你可以试试这样的东西

def load_file(file):

    file = open(file, "r")
    all_lines = file.read()

    try:        
        return int(all_lines)

    except ValueError:
        try:
            return float(all_lines)
        except ValueError:
             return all_lines

    file.close()

您可以在异常中嵌套trys以使其执行您想要的操作

答案 3 :(得分:0)

您的方法存在的问题是float(all_lines)可能会失败,但不处理该异常。

所以它应该是:

try:        
    return int(all_lines)
except ValueError:  # handle the exception if it's not an integer
    try:
        return float(all_lines)
    except ValueError:  # handle the exception if it's not a float
        return all_lines

但你也可能只有suppress个错误(虽然需要python 3.3或更新版本)。这可以减少代码的长度以及嵌套tryexcept的数量:

from contextlib import suppress

def load_file(file):
    with open(file, "r") as file:  # using open with "with" closes the file automatically.
        all_lines = file.read()

    with suppress(ValueError):
        return int(all_lines)
    with suppress(ValueError):
        return float(all_lines)
    return all_lines