有关ocilib错误处理的问题,如何使用ocilib正确捕获日志错误?

时间:2019-09-11 08:32:20

标签: c++ ocilib

我对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()函数也向我返回空指针。

例如:

  1. 我正在使用ocilib插入错误的数据。
  2. Ocilib告诉我数据不正确以及原因(通过回调)。
  3. 我正在使用ocilib插入相同的不正确数据。
  4. Ocilib告诉我在不调用回调函数的情况下出现了问题,而ocilib并没有告诉我原因(这是问题所在)。
  5. 我正在使用ocilib插入另一个不正确的数据。
  6. Ocilib告诉我,没有调用回调有问题,而ocilib并没有告诉我原因。

也许我在处理错误方面做错了。帮助将不胜感激。

在C ++ 11应用程序上使用4.6.2 ocilib版本。

1 个答案:

答案 0 :(得分:0)

您能否使用示例代码在ocilib GitHub存储库上打开问题  重现问题?

顺便说一句,当您使用C ++进行编码时,为什么不使用Ocilib C ++ API?