理解Python异常处理中的提升

时间:2014-07-02 13:33:12

标签: python exception exception-handling

处理python异常时raise会做什么?

我得到了一些代码

def func():
  try :
    'some code here'
  except Exception, e:
     some_issue_entry(False, ke)
     db_entry(False, ke)
     raise

  except KeyboardInterrupt, ke:
     some_issue_entry(False, ke)
     db_entry(False, ke)
     raise

  some_issue_entry(True, None)
  db_entry(True, None)

所以这里我要替换的代码因为我不想编写与不同参数相同的常用函数代码:

def func():
  success, exec = True, None
  try :
    'some code here'
  except Exception, e:
     success, exec = False, e

  except KeyboardInterrupt, ke:
     success, exec = False, ke

  some_issue_entry(success, exec)
  db_entry(success, exec)

  if not success:
     raise

以下是我的查询:

  1. 只是 raise如何处理异常并进行区分。因为它使用第一种样式引发了正确的异常。它是从本地存储的异常中选择的吗?

  2. 虽然使用第二种风格也有效(没有完全测试),虽然我不知道为什么因为我假设加注与尝试相关联,除了仅。使用第二种风格是否安全。

1 个答案:

答案 0 :(得分:0)

Python使用当前线程上下文存储最后捕获的异常。因此,所有raise必须做的是retrieve that exception again

do_raise(PyObject *type, PyObject *value, PyObject *tb)
{
    if (type == NULL) {
        /* Reraise */
        PyThreadState *tstate = PyThreadState_GET();
        type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
        value = tstate->exc_value;
        tb = tstate->exc_traceback;
        Py_XINCREF(type);
        Py_XINCREF(value);
        Py_XINCREF(tb);
    }

其中PyThreadState_GET()查找当前线程上下文。

raise statement documentation

记录了这一点
  

如果没有表达式,则raise重新引发当前作用域中活动的最后一个异常。

此处范围整个功能,而不仅仅是except套件。