Python 调用sys.exit()和引发异常之间的区别

Python 调用sys.exit()和引发异常之间的区别,python,exception-handling,Python,Exception Handling,在Python中调用sys.exit()和抛出异常有什么区别 假设我有一个Python脚本,它执行以下操作: 打开一个文件 读台词 关上它 如果文件不存在或在运行时抛出IOException,下面哪个选项更有意义 没有异常的exception/catch,如果发生异常,它将失败(这是预期的行为) 排除/捕获异常,记录错误消息,自己抛出自定义异常,失败 在除IOException之外的块中,退出时会显示一条错误消息,例如sys.exit(“出错”) 选项3是否会终止进程,而选项1和2则不会?如果P

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

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

  • 打开一个文件
  • 读台词
  • 关上它
  • 如果文件不存在或在运行时抛出
    IOException
    ,下面哪个选项更有意义

  • 没有异常的exception/catch,如果发生异常,它将失败(这是预期的行为)
  • 排除/捕获异常,记录错误消息,自己抛出自定义异常,失败
  • 在除IOException之外的
    块中,退出时会显示一条错误消息,例如
    sys.exit(“出错”)

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

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

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


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

    有一点细微的区别:

    import sys
    
    try:
        sys.exit()
    except:
        print("Caught")
    
    except
    语句捕获异常,而:

    import sys
    
    try:
        sys.exit()
    except Exception:
        print("Caught")
    
    无误退出
    SystemExit
    异常(如
    KeyboardInterrupt
    )不是由
    异常捕获的,而是由
    异常捕获的

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