簡體   English   中英

mysql c ++ connector:如何檢查失敗的連接並從中恢復而不會崩潰

[英]mysql c++ connector: How to check for and recover from failed connection without crashing

我有一個大多數時間都可以運行的mysql程序,但是我在關閉mysql服務器的情況下對其進行了測試,然后開始出現問題。

首先,我連接到服務器並嘗試獲取數據庫。 由於我在關閉mysql服務器時正在運行此程序,因此當我告訴它進行連接然后繼續運行時會遇到異常。 然后,稍后我想對服務器執行其他操作,然后再進行檢查,然后檢查連接是否打開或由於某種原因導致連接斷開。

連接失敗,然后調用isClosed()函數,程序崩潰! 我在代碼行的前后放置了測試,很明顯,一旦我調用isClosed(),程序就會崩潰。 isClosed()崩潰沒有任何意義,因為我還想知道我的連接是否工作? (當然,如果我在異常塊中,我可以知道,但是假設我也想問一下它是否在其他地方也關閉了)。

try
    {
        con = drvr->connect(serverLoginParams.hostname, serverLoginParams.username, serverLoginParams.password);
        con->setSchema(db);
    }
catch (sql::SQLException &e) 
    {
        std::cout << "# ERR: SQLException in " << __FILE__;
        std::cout << "(" << __FUNCTION__ << ") on line "<< __LINE__ << std::endl;
        std::cout << "# ERR: " << e.what();
        std::cout << " (MySQL error code: " << e.getErrorCode();
        std::cout << ", SQLState: " << e.getSQLState() << " )" << std::endl;
    }

    // ... more code here ... //

if (con->isClosed())
{
     // do something    
}

在列出的代碼中,可能永遠不會將con設置為真實值。

如果drvr->connect(...)引發異常,則con永遠不會設置為有效的指針,因此您無法調用con->isClosed() ,即未指向有效的連接對象。

您需要將isClosed()調用移到try塊中,或者在檢測到connect()引發異常后進行重組以紓困。

不是isClosed()函數中的代碼使程序崩潰,而是事實是您在無效的對象(可能為nullptr ,未顯示聲明/初始化)上調用該代碼,這在C ++中是未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM