我有一个Person包含一个name(str)和age(int)列的表的数据库。所以,我为我的sqlite3.connection
def adult(age):
return age > 18
Run Code Online (Sandbox Code Playgroud)
并使用以下代码,它工作正常
connection = sqlite3.connect(r'C:\Dev\Garbage\database.db')
with connection:
connection.create_function('adult', 1, adult)
cursor = connection.cursor()
persons = cursor.execute('select "p"."name", "p"."age" from "Person" "p" where adult("p"."age")').fetchall()
for person in persons:
print(person)
Run Code Online (Sandbox Code Playgroud)
但如果我adult像这样改变
def adult(age):
return 1 / 0
Run Code Online (Sandbox Code Playgroud)
我会得到sqlite3.OperationalError: user-defined function raised exception。在我的项目中,它可能包含大量函数,我想知道 -有没有办法知道哪个函数引发了异常?或者得到ZeroDivisionError: division by zero而不是这个。
Python 的sqlite3模块会丢弃异常中的任何错误信息,并将其替换为您所看到的常量消息:
void _pysqlite_func_callback(sqlite3_context* context, int argc, sqlite3_value** argv)
{
...
py_func = (PyObject*)sqlite3_user_data(context);
args = _pysqlite_build_py_params(context, argc, argv);
if (args) {
py_retval = PyObject_CallObject(py_func, args);
Py_DECREF(args);
}
ok = 0;
if (py_retval) {
ok = _pysqlite_set_result(context, py_retval) == 0;
Py_DECREF(py_retval);
}
if (!ok) {
if (_enable_callback_tracebacks) {
PyErr_Print();
} else {
PyErr_Clear();
}
sqlite3_result_error(context, "user-defined function raised exception", -1);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我不知道是什么阻止了它向返回的错误消息附加异常消息。
无论如何,可以通过调用enable_callback_tracebacks打印出内部堆栈跟踪:
import sqlite3
db = sqlite3.connect(':memory:')
def error():
raise Exception('hello')
db.create_function('error', 0, error)
sqlite3.enable_callback_tracebacks(True) # <-- !
db.execute('select error()')
Run Code Online (Sandbox Code Playgroud)
回溯(最近一次调用最后一次): 文件“<stdin>”,第 1 行,出错 例外:你好 回溯(最近一次调用最后一次): 文件“<stdin>”,第 1 行,在 sqlite3.OperationalError:用户定义的函数引发异常
| 归档时间: |
|
| 查看次数: |
1630 次 |
| 最近记录: |