调用sys.exit()和抛出异常之间的区别

时间:2012-05-29 09:56:22

标签: python exception-handling

调用sys.exit()和在Python中抛出异常有什么区别?

假设我有一个Python脚本,它执行以下操作:

  1. 打开文件
  2. 读取行
  3. 关闭它
  4. 如果文件不存在或者在运行时抛出IOException,下面哪个选项更有意义?

    1. 没有异常/异常捕获,如果发生异常,则失败(无论如何都是预期的行为)
    2. 除了/捕获异常,记录错误消息,自己抛出自定义异常,失败。
    3. except IOException块中,退出并显示错误消息,例如sys.exit("something is wrong")
    4. 选项3是否会终止进程,而1和2则不会?考虑到Python没有像Java那样的检查异常(我真的是Java开发人员^ _ ^),处理Python异常的最佳方法是什么?

2 个答案:

答案 0 :(得分:14)

sys.exit提出SystemExit本身,因此从纯粹的技术角度来看,自己提出异常或使用sys.exit之间没有区别。是的,您可以像其他任何异常一样捕获SystemExit个异常并忽略它。

所以这只是更好地记录你的意图的问题。

PS:请注意,这也意味着sys.exit实际上是一个非常糟糕的用词 - 因为如果你在一个线程中使用sys.exit,那么线程就会被终止而没有别的。这可能很烦人,是的。

答案 1 :(得分:2)

有一个小的,微妙的区别:

import sys

try:
    sys.exit()
except:
    print("Caught")

except语句捕获异常,而:

导入sys

try:
    sys.exit()
except Exception:
    print("Caught")

退出没有错误。 SystemExit未发现KeyboardInterrupt异常(例如except Exception),但except仅发现{。}}。

因此,如果来电者使用except:捕获所有内容(这是不好的做法),那么您的sys.exit将不会退出,但会被视为“错误”(这就是为什么except Exception:是更好的是确保捕获除CTRL + C和系统退出(属于BaseException类)之外的所有异常。