[英]Establishing a MySQL connection without the MySql Connector for C++
[英]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.