如何从 sqlite create_function 获取错误类型?

sas*_*ero 4 python sqlite

我有一个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而不是这个。

CL.*_*CL. 7

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:用户定义的函数引发异常