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

She*_*jie 9 python exception-handling

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

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

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

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

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

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

Voo*_*Voo 16

sys.exit提出了SystemExit自己所以从纯技术角度有自己养的是异常或使用之间没有什么区别sys.exit.是的,你可以SystemExit像任何其他异常一样捕获异常并忽略它.

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

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


Jea*_*bre 6

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

import sys

try:
    sys.exit()
except:
    print("Caught")
Run Code Online (Sandbox Code Playgroud)

except语句捕获异常,而:

import sys

try:
    sys.exit()
except Exception:
    print("Caught")
Run Code Online (Sandbox Code Playgroud)

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

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