我对ocilib的错误处理有问题。
我目前正在使用OCILIB提供两种错误处理机制:
我如何初始化:
if (!isInit && !OCI_Initialize(&OracleManager::errorHandler, NULL, OCI_ENV_DEFAULT | OCI_ENV_CONTEXT))
throw ibs::exceptions::trace::db(61400, mManager.getMessage(61400));
我的错误处理回调:
static void errorHandler(OCI_Error *error)
{
LOG_(ibs::io::log::IN_CONSOLE, plog::debug) << OCI_GetSql(OCI_ErrorGetStatement(error));
LOG_(ibs::io::log::IN_FILE, plog::debug) << OCI_GetSql(OCI_ErrorGetStatement(error));
throw ibs::exceptions::trace::db(61403, "code: " + std::to_string(OCI_ErrorGetOCICode(error)) + ", " + OCI_ErrorGetString(error));
}
上下文线程错误处理:
if (!OCI_ExecuteStmt(mSt, query.c_str()))
{
OCI_Error *err = OCI_GetLastError();
if (err == nullptr || OCI_ErrorGetOCICode(err) == 0)
{
LOG_(ibs::io::log::IN_CONSOLE, plog::debug) << query;
LOG_(ibs::io::log::IN_FILE, plog::debug) << query;
throw ibs::exceptions::trace::db(61407, mManager.getMessage(61407));
}
errorHandler(err);
}
我的问题是:
在我第一次插入(在数据库上)错误时:Ocilib使用正确的错误描述调用我的回调。
第二次(以及更多)插入错误:Ocilib不调用我的回调,但OCI_ExecuteStmt()返回我为“ false”,并且我的数据未插入数据库。
检测到错误的事实必须是正确的。但是,对于第二个(以及更多个)错误,我没有关于错误的任何信息。
出于可追溯性的目的,我需要知道:为什么我的数据被拒绝?
我的问题是我只有第一个错误才有此信息。
即使对于上下文线程错误处理,即使数据被拒绝并且OCI_ExecuteStmt()返回我“ false”,OCI_GetLastError()函数也向我返回空指针。
例如:
也许我在处理错误方面做错了。帮助将不胜感激。
在C ++ 11应用程序上使用4.6.2 ocilib版本。
答案 0 :(得分:0)
您能否使用示例代码在ocilib GitHub存储库上打开问题 重现问题?
顺便说一句,当您使用C ++进行编码时,为什么不使用Ocilib C ++ API?