mysql_real_connect阻塞_mysql_real_connect崩溃、未经处理的异常

mysql_real_connect崩溃、未经处理的异常

背景

近期客户测试软件,功能里有mysql连接问题,在mysql连接失败时,客户机器上出现“已停止工作”界面,而我机器上软件直接退出没有提示自动关闭。

查找分析

因为是一直用的代码,和网上代码对比mysql_real_connect也用法一样,想不到哪里错误,就先加上mysql的option处理代码,类似如下。

unsigned int timeout = 5;

int ret = mysql_options(_connectionHandlerPtr, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout);

if (ret) {

throw DataBaseError("mysql参数设置失败");

return;

}

if (NULL == mysql_real_connect(_connectionHandlerPtr, server.c_str(), user.c_str(), password.c_str(), database.c_str(), import, NULL, 0))

{

throw DataBaseError("连接数据库失败");

return;

}

char value = 1;

mysql_options(_connectionHandlerPtr, MYSQL_OPT_RECONNECT, &value);

加了还是不行,不过用代码调试运行报“未经处理的异常”,就查try,catch代码,把catch里括号里参数类型里*去掉,“未经处理的异常”不报了,mysql_real_connect也不崩溃了。

未经处理的异常

从msdn里查下try catch的描述。

try {

// code that could throw an exception

}

[ catch (exception-declaration) {

// code that executes when exception-declaration is thrown

// in the try block

}

[catch (exception-declaration) {

// code that handles another exception type

} ] . . . ]

// The following syntax shows a throw expression:

throw [expression]

exception-declaration不是无变化的意思,它是和throw的值类型有关的,如果throw "abc",则catch里可以带*号是char*,如果throw CXXError,就要catch(CXXError e),抛出什么类型就要catch什么类型,如果类型不一致,则会报“未经处理的异常”。

mysql_real_connect崩溃

mysql_real_connect连接失败是会正常上报,代码对应处理时会throw,是throw的问题,mysql_real_connect没有问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL是一种常用的关系型数据库管理系统,mysql_real_connect()是MySQL C API提供的一个函数,用于建立与MySQL服务器的连接。下面是mysql_real_connect()函数的用法: ``` MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag); ``` 参数说明: - mysql:已经初始化的MYSQL结构体指针,用于存储连接和查询结果。 - host:MySQL服务器的主机名或IP地址。 - user:连接MySQL服务器的用户名。 - passwd:连接MySQL服务器的密码。 - db:连接MySQL服务器后要使用的数据库名。 - port:MySQL服务器连接端口,默认为3306。 - unix_socket:UNIX域套接字文件路径。 - clientflag:用于设置连接选项。 函数返回一个MYSQL结构体指针,代表与MySQL服务器的连接连接建立成功时返回非空指针,否则返回空指针。 下面是一个建立与MySQL服务器连接的示例: ``` #include <mysql.h> #include <stdio.h> int main() { MYSQL *conn; char *host = "localhost"; char *user = "root"; char *password = "123456"; char *database = "test"; conn = mysql_init(NULL); if (!conn) { printf("MySQL initialization failed!\n"); return 1; } conn = mysql_real_connect(conn, host, user, password, database, 0, NULL, 0); if (conn) { printf("MySQL connection succeeded!\n"); } else { printf("MySQL connection failed!\n"); } mysql_close(conn); return 0; } ``` 在这个示例中,我们使用mysql_init()函数初始化一个MYSQL结构体指针,然后使用mysql_real_connect()函数建立与MySQL服务器的连接。如果连接建立成功,则输出"MySQL connection succeeded!",否则输出"MySQL connection failed!"。最后使用mysql_close()函数关闭与MySQL服务器的连接。 希望这个示例能够帮助你理解mysql_real_connect()函数的用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值