12

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

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

  1. 打开一个文件
  2. 读行
  3. 关闭它

如果文件不存在或IOException在运行时被抛出,以下哪个选项更有意义?

  1. 没有异常/捕获异常,如果发生异常,它会失败(无论如何这是预期的行为)
  2. 排除/捕获异常,记录错误消息,自己抛出自定义异常,失败。
  3. 在一个except IOException块中,退出并显示错误消息,例如sys.exit("something is wrong")

选项 3 是否会终止进程,而 1 和 2 不会?鉴于 Python 没有像 Java 这样的已检查异常(我真的是 Java 开发人员^_^),处理 Python 异常的最佳方法是什么?

4

2 回答 2

19

sys.exit引发 aSystemExit本身,因此从纯粹的技术角度来看,自己引发异常或使用sys.exit. 是的,您可以像任何其他异常一样捕获SystemExit异常并忽略它。

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

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

于 2012-05-29T10:02:10.230 回答
6

有一个细微的差别:

import sys

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

except语句捕获异常,而:

import sys

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

退出没有错误。SystemExit异常 (like KeyboardInterrupt) 不会被 捕获except Exception,而是被except单独捕获。

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

于 2018-02-01T20:40:59.293 回答