我正在尝试解决有关错误处理的这一挑战。也许我离开了!
挑战描述:
编写一个名为" 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()
答案 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或更新版本)。这可以减少代码的长度以及嵌套try
和except
的数量:
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