首页 > 解决方案 > 处理文件时如何正确处理错误?

问题描述

节目说明:

.txt程序从第一个输入创建一个具有给定名称的文件。之后,它接受来自每个输入的文件的文本行,直到输入仅包含一个字符串"end"(不应包含此结束行)。该程序还应该处理所有可能的错误。

我的解决方案:

def writef(f, st):
    try:
        assert st == "end", "* End of the file (not included)"
        assert not(f.endswith(".txt")), "txt only"
    except IOError:
        print("Unexpected error")
    except AssertionError as sterr:
        print(sterr)
    f.write(st + "\n")

t = input("* Beggining of the file (.txt supported only): ")
f = open(t, "w+")
while True:
    exec_st = input("> ")
    writef(f, exec_st)

问题:

Traceback (most recent call last):
 File "C:\Users\1\Desktop\IT\pycharm\em_1.py", line 15, in <module>
   writef(f, exec_st)
 File "C:\Users\1\Desktop\IT\pycharm\em_1.py", line 4, in writef
   assert not(f.endswith(".txt")), "txt only"
AttributeError: '_io.TextIOWrapper' object has no attribute 'endswith'

我将不胜感激,在此先感谢。

标签: python

解决方案


断言语句的工作方式是当你说

assert st == "end", "* End of the file (not included)"

你是说你假设st等于end。如果由于某种原因这不是真的,请引发错误。使用!=将使程序按照您的解释工作,但是,您甚至不应该在这里使用断言语句。断言语句仅用于完整性检查,它们在生产中被剥离。我的意思是大多数公司将以一种特殊的优化模式运行 Python,该模式会跳过断言语句。有关更多信息,请参阅此问题。而是引发如下错误:

if st == "end":
    raise RuntimeError("* End of the file (not included)")

这将确保您的错误在应有的时候被提出,但我们仍然需要处理该'_io.TextIOWrapper' object has no attribute 'endswith'错误。您正在检查是否f不以“.txt”结尾。fopen()返回什么,如果您查找文档以查看该函数返回的内容,您会发现它不返回字符串,但该endswith函数只能对字符串进行操作,因此会出现错误。你可以做的是传递t给你的writef函数并检查它是否以“txt”结尾,或者你可以像 PIG208 提到的那样做并检查是否f.name以“.txt”结尾。


其他一些需要考虑的事情:

  • 您应该养成使用更具描述性的名称的习惯。当您稍后回到您的代码时,它会为您提供帮助。我不知道代表什么tst将来你也不知道它们代表什么。

  • 您应该尽可能避免打印出“意外错误”,以支持更具体的错误消息。你只会因为不告诉他们发生了什么而惹恼他们,当你的用户抱怨这个非常笼统的错误消息时,你会惹恼自己。

  • 您的 try catch 块围绕一些不做任何 IO 工作的断言语句,但无论如何您都会捕获 IO 错误。这是没有必要的。如果你得到一个 IO 错误,它将来自f.writeoropenf.close


推荐阅读