繁体   English   中英

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

[英]Issue on ocilib error handling, how to correctly catch logs errors with 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_GetLastError()函数也向我返回空指针,而OCI_ExecuteStmt()返回我为“ false”。

例如 :

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

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

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

您可以在ocilib GitHub存储库上打开一个问题,并提供重现该问题的示例代码吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM