【问题标题】:Python error exceptionPython 错误异常
【发布时间】:2013-07-13 15:31:24
【问题描述】:

我有一个脚本,它创建一个临时文本文件并在用户关闭窗口后删除。

问题在于,可能会或可能不会创建临时文本文件,具体取决于用户所做的事情。或者有时可能会在用户退出之前删除临时文本文件。有三种可能的情况。

  1. 临时文本文件以“tempfilename”的名称创建。
  2. 临时文本文件以“tempfilename”的名称创建,但在用户退出之前被删除。因此,当尝试删除文件时,它会引发OSError
  3. 没有创建临时文本文件,也没有创建名为“tempfilename”的变量,所以它引发NameError

我尝试过使用此代码:

try:
    os.remove(str(tempfilename))
except OSError or NameError:
    pass

但它似乎只捕获OSError。我是不是做错了什么?

【问题讨论】:

  • 你为什么要抓NameError?你知道只有当你的变量名有错字时才会出现这种情况,对吧?
  • @delnan:阅读这个问题,这听起来像是 tempfilename 可能无法创建(大概它是在 if 语句中创建的。我会更改它以添加 tempfilename = None at开始然后做if tempfilename:,但这不是我的代码
  • @delnan 每当用户单击退出按钮时,我都会执行上述代码。并且文件名变量“tempfilename”仅在用户执行特定任务时创建。有时用户不做任何事情就关闭了脚本,因此甚至没有创建变量名“tempfilename”。在这种情况下,它会给我NameError。我是初学者,所以不确定我是否做对了。但无论什么工作.. :D
  • @ChrisAung 总是定义变量,初始化为一些虚拟值(例如None)。恕我直言,这不仅更干净,而且代码更少,您可以停止捕获NameError,这可能会隐藏合法错误(例如拼写错误)。

标签: python exception-handling error-handling


【解决方案1】:
try:
    os.remove(str(tempfilename))
except (OSError, NameError):
    pass

【讨论】:

  • 是的。 :) 你是个大人物。@Stephan
【解决方案2】:
tempfilename = None

# ...

if tempfilename is not None and os.path.exists(tempfilename):
    os.remove(tempfilename)

捕捉NameError 不好,因为它会隐藏代码中的其他拼写错误(例如,os.remov(…))。

另外,OSError 并不总是意味着该文件不存在。在 Windows 上,如果文件正在使用中,则会引发异常 (http://docs.python.org/2/library/os.html#os.remove)。在这种情况下,您可能希望查看异常,以便了解问题和/或以其他方式处理。

异常处理程序应保持尽可能窄以避免隐藏不相关的错误或错误

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2013-11-03
    • 2021-03-31
    相关资源
    最近更新 更多