C++ 抛出异常并忽略“到达非void函数末尾”警告是否不好?

C++ 抛出异常并忽略“到达非void函数末尾”警告是否不好?,c++,C++,我的代码: QSerialPortInfo getCentralInfo() { const QList<QSerialPortInfo> infoList = QSerialPortInfo::availablePorts(); for (auto it = infoList.cbegin(); it != infoList.cend(); ++it) { if (it->manufacturer()

我的代码:

QSerialPortInfo getCentralInfo()
{
    const QList<QSerialPortInfo> infoList =
            QSerialPortInfo::availablePorts();
    for (auto it = infoList.cbegin();
         it != infoList.cend(); ++it) {
        if (it->manufacturer() == "1a86") {
            happyTalk("Znaleziono centralkę.");
            return *it;
        }
    }
    escape("Nie znaleziono centralki.");
}

void escape(QString errorMsg) {
    qDebug() << "[!] " << errorMsg;
    throw;
}

void happyTalk(QString msg) {
    qDebug() << "[\u2713] " << msg;
}

这样停止应用程序是否优雅?为什么不优雅?我收到调试器警告,但我认为调试器错了-

这里的问题是

throw;
并不意味着抛出一些异常。这意味着重新显示当前正在处理的异常。如果在没有活动异常的情况下执行throw,我相信它会调用std::terminate来结束程序

处理这个问题的一种更优雅的方法是抛出一个异常(可能是一个std::logic_错误),以指示发生了错误并将控制权转移到错误处理程序,或者通过调用exit或abort退出程序


希望这有帮助

这里的问题是

throw;
并不意味着抛出一些异常。这意味着重新显示当前正在处理的异常。如果在没有活动异常的情况下执行throw,我相信它会调用std::terminate来结束程序

处理这个问题的一种更优雅的方法是抛出一个异常(可能是一个std::logic_错误),以指示发生了错误并将控制权转移到错误处理程序,或者通过调用exit或abort退出程序

希望这有帮助

添加[[noreturn]]属性以转义,并实际抛出一个对象

[[noreturn]]告诉编译器、优化器和警告生成器escape永远不会返回,因此在理想情况下它应该阻止该错误。

添加[[noreturn]]属性以进行escape,并实际抛出一个对象


[[noreturn]]告诉编译器、优化器,并希望警告生成器,escape永远不会返回,因此在理想情况下它应该阻止该错误。

这并没有达到它停止警告的效果,它只在调用escape时发出警告,在一切正常时发出警告-我很困惑,但无论如何,我已经与exit0交换了抛出:-这并没有起到什么作用,它停下来只是在呼叫逃跑时发出警告,在一切正常时发出警告——我感到困惑,但无论如何,我已经与exit0交换了掷骰-[[noreturn]]是C++11-升级您的编译器@smsware我正在使用C++11,你确定qmake开发人员实现了这一点吗?@smsware我不知道你的编译器的实际C++11支持是什么。[[noreturn]]是C++11-升级你的编译器@smsware我正在使用C++11,你确定qmake开发人员实现了这一点吗?@smsware我不知道你的编译器对C++11的实际支持是什么。