簡體   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