当前位置: 首页 > 知识库问答 >
问题:

Weird-MySQL的SQL::SqlException不是按其类型捕获的,而是作为std::Exception捕获并成功反强制执行

商宝
2023-03-14

我使用mysql C++connector和这段(稍微简化了一点)代码。

try
{
    statement->setString(1, word);
    statement->executeUpdate();
}
catch( sql::SQLException& e )
{
    // I don't get here
    return sqlerrno_to_error_code( e.getErrorCode() );
}
catch( std::exception& e )
{
    // I do get here and the cast works
    sql::SQLException& sqle = (sql::SQLException&) e;
    return sqlerrno_to_error_code( sqle.getErrorCode() );
}

连接器应该抛出SQL::SqlException,它派生自std::Exception并具有一些附加方法,如geterrorcode()

抛出的异常在第二个catch块中捕获,但可以成功转换为(并用作)SQL::SQLException

更奇怪的是,不同可执行文件中的类似代码会像预期的那样捕获SQL::SQLException。它们之间的区别在于,第一个是在一个共享对象(.so)中,该对象加载了dlopen()

共有1个答案

公良玺
2023-03-14

请参见GCC常见问题页面中的Dynamic_CASTThrowTypeID不使用共享库的注意事项。

因为您使用的是dlopen(),所以您需要使用-e标志来链接您的可执行文件(或者如果g++正在调用链接器,则将
-wl,-e传递到g++),并将RTLD_global标志传递到dlopen()

 类似资料:
  • 问题内容: 我是jQuery的新手,并在旧的教程上使用了以下代码段: 但是我得到这个错误 未捕获的TypeError:$ .ajax(…)。成功不是函数 在 我想知道这里有什么问题吗? 问题答案: 对ajax的调用应如下所示: 您没有方法链接成功函数,它是字典参数中的条目之一。

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 我正在查看Java SE7的新功能,目前我正在: http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html 关于捕获多重功能,当我遇到这个语句时: 注意:如果一个捕捉块处理多个异常类型,那么捕捉参数是隐式最终的。在这个例子中,捕捉参数ex是最终的,因此您不能在捕捉块中给它赋值。 我从未注意到

  • 问题内容: 我想将预览层“流式传输”到我的服务器,但是,我只希望发送特定的帧。基本上,我想拍摄AVCaptureVideoPreviewLayer的快照,将其缩放到28 * 28,将其转换为强度数组,然后将其发送到我的python后端处理其余部分的套接字层。 这里的问题是AVCapturePhotoOutput的捕获功能异常缓慢。我不能重复调用该函数。更不用说它总是使相机的快门声哈哈。 另一个问题

  • 这对我来说很奇怪。继承自,后者继承自。 但是 还有,这有点企业设计的味道。不同的程序员或团队可以添加回调来处理该项,但它们应该相互隔离。这意味着,作为负责将这些回调相互隔离的程序员,我不应该依赖它们来确保错误不会溜走。捕捉应该是正确的,但这并不是因为会漏过。所以我更普遍的问题是:这里什么是好的模式?只是,我认为这是由于继承导致的语法错误?