【问题标题】:strange exceptions.SystemExit in Python 2.7Python 2.7 中的奇怪异常.SystemExit
【发布时间】:2016-09-13 05:43:49
【问题描述】:

这是我的代码和错误信息,有人知道为什么会有这样的异常吗?谢谢。

源代码

import sys
import tensorflow as tf

def main(argv):
  print 'in main'
def f():
    # this method will call def main(argv)
    try:
        tf.app.run()
    except:
        print "tf.app.run error ", sys.exc_info()

if __name__ == "__main__":
    f()

错误代码

in main
tf.app.run error  (<type 'exceptions.SystemExit'>, SystemExit(), <traceback object at 0x10fa33f38>)

【问题讨论】:

  • 这就是为什么你应该从不使用一个简单的except:子句。它捕获所有异常,包括那些用于终止程序的异常。因此,如果您的代码在某个地方必须失败并停止,except 将阻止它这样做。如果您改用except Exception:,它将不会捕获此类异常。

标签: python python-2.7 exception tensorflow


【解决方案1】:

这是预期行为:tf.app.run()main() 的结果传递给sys.exit()(以便更容易设置编辑代码),sys.exit() 引发exceptions.SystemExit 异常。

重要的是要提到使用tf.app.run()完全可选。许多 TensorFlow 脚本都包含它,因为它与 Google Python 编码风格更兼容。但是,如果您需要自定义脚本中的逻辑,您可以省略tf.app.run()。 (同样适用于tf.app.flags。)

【讨论】:

  • 谢谢先生,这是我应该处理的错误吗?名称exceptions 听起来有些不对劲,输出这样的东西似乎不是很优雅?
  • 我怀疑你是否想要处理它,因为它只在main() 的末尾提出。
  • 谢谢 mrry,tf.app.run 有什么特别之处吗?我写了很多Python脚本并从头到尾执行__main__没有看到它引发`exceptions.SystemExit`异常。
  • 是的,此行为特定于 tf.app.run()。请注意,您不需要使用tf.app.run() 启动脚本才能使用TensorFlow;这只是一种约定,让 Google 开发人员可以更轻松地在 Google 代码库内外使用相同的脚本。
  • tf.app.run() 不支持在main() 返回后运行代码(除了捕获SystemExit 异常,这是未记录的行为)。幸运的是,您无需调用 tf.app.run() 即可使用 TensorFlow,因此您可以随意构建您的脚本。
【解决方案2】:

它来自sys.exit() 电话,关于它的说法如下:

由于exit()最终“只”引发异常,所以只有在主线程调用时才会退出进程,异常不会被拦截。

在您的情况下,sys.exit 似乎是从函数run() 无条件调用的,因此请避免拦截SystemExit

如果您想处理各种与应用程序相关的异常,请尝试捕获Exception 而不是裸露的except,因为SystemExit

...从 BaseException 而不是 Exception 继承,这样它就不会被捕获 Exception 的代码意外捕获。这允许异常正确地向上传播并导致解释器退出。

【讨论】:

  • 谢谢 bereal,这是我应该处理的错误吗?名字exceptions 听起来有些不对劲,输出这样的东西似乎不是很优雅?
  • @LinMa 不,你不应该处理它,除非你想在被调用的应用程序退出后做其他事情。
  • 谢谢 bereal,tf.app.run 有什么特别之处吗?我写了很多Python脚本并从头到尾执行__main__没有看到它引发`exceptions.SystemExit`异常。
  • 顺便说一句,如果我需要在tf.app.run() 之后运行任何代码会出现问题,因为tf.app.run() 会使解释器退出,有什么想法可以处理吗?谢谢。
  • 然后拦截它并在以后需要时重新调用,或者最好使用其他 API tensorflow 公开(我确信它会这样做,但没有经验)。
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多