【问题标题】:Difference between calling sys.exit() and throwing exception调用 sys.exit() 和抛出异常的区别
【发布时间】:2012-05-29 09:56:22
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python exception-handling


    【解决方案1】:

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

    因此,只需更好地记录您的意图即可。

    PS:请注意,这也意味着sys.exit 实际上是一个非常糟糕的误称——因为如果您在线程中使用sys.exit,则只会终止线程,而不会终止其他任何事情。这可能很烦人,是的。

    【讨论】:

      【解决方案2】:

      有一个细微的差别:

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

      except 语句捕获异常,而:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-10-23
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多