【问题标题】:Is sys.exit equivalent to raise SystemExit?sys.exit 是否等同于 raise SystemExit?
【发布时间】:2016-03-30 07:21:38
【问题描述】:

根据sys.exit 和SystemExit 上的文档,看来

def sys.exit(return_value=None):  # or return_value=0
    raise SystemExit(return_value)

这是正确的还是sys.exit 之前做过其他事情?

【问题讨论】:

    标签: python exception exit


    【解决方案1】:

    根据Python/sysmodule.c,提高SystemExit就是它所做的一切。

    static PyObject *
    sys_exit(PyObject *self, PyObject *args)
    {
        PyObject *exit_code = 0;
        if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
            return NULL;
        /* Raise SystemExit so callers may catch it or clean up. */
        PyErr_SetObject(PyExc_SystemExit, exit_code);
        return NULL;
    }
    

    【讨论】:

      【解决方案2】:

      你可以在源代码https://github.com/python-git/python/blob/715a6e5035bb21ac49382772076ec4c630d6e960/Python/sysmodule.c看到

      static PyObject *
      sys_exit(PyObject *self, PyObject *args)
      {
          PyObject *exit_code = 0;
          if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
              return NULL;
          /* Raise SystemExit so callers may catch it or clean up. */
          PyErr_SetObject(PyExc_SystemExit, exit_code);
          return NULL;
      }
      

      它只是引发 SystemExit 而没有做任何其他事情

      【讨论】:

      【解决方案3】:

      是的,提高SystemExit 和调用sys.exit 在功能上是等效的。 See sys module source.

      PyErr_SetObject 函数是 CPython 实现引发 Python 异常的方式。

      【讨论】:

      • 谢谢 - 请注意,当链接到 github 代码中的特定行时,建议先按 y 以获取您当前所在提交的规范 URL,例如今天github.com/python/cpython/blob/… - 未来的提交可能会严重改变路线
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      • 2012-12-09
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2017-11-29
      • 2010-11-30
      相关资源
      最近更新 更多