处理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
以下是我的查询:
只是 raise
如何处理异常并进行区分。因为它使用第一种样式引发了正确的异常。它是从本地存储的异常中选择的吗?
虽然使用第二种风格也有效(没有完全测试),虽然我不知道为什么因为我假设加注与尝试相关联,除了仅。使用第二种风格是否安全。
答案 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
套件。