C++ try catch 不适用于超出范围的数组

C++ try catch does not work for array out of bound

我们有一个基于 QT 的 c++ 应用程序。我们也在其中使用第三方 dll。但是,C++ try and catch 根本不起作用。

例如:

#include <QCoreApplication>
#include <QDebug>
#include <QException>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int arr[10];
    try
    {
        arr[11] = 30;
    }
    catch (const std::out_of_range& e)
    {
        qDebug() << "Exception out of range occurred ..." << e.what();
    }
    catch (...)
    {
        qDebug() << "Unknown Exception occured...";
    }

    return a.exec();
}

以上是最小的例子。在上面它使程序崩溃。 有办法处理吗?

回答你的问题:

"C++ try catch does not work for third party library"

不! C++ try catch 与第三方 (Qt) 库一起工作,如下例所示。

但是您显示的代码不是 mcve。因此很难说,究竟是什么导致了您所说的问题。

#include <QCoreApplication>
#include <QDebug>
#include <QException>

class testException : public QException
{
public:
    testException(QString const& message) :
        message(message)
    {}

    virtual ~testException()
    {}

    void raise() const { throw *this; }
    testException *clone() const { return new testException(*this); }

    QString getMessage() const {
        return message;
    }
private:
    QString message;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    try
    {
        // throw std::out_of_range("blah");
        throw testException("blah");
    }
    catch (const std::out_of_range& e)
    {
        qDebug() << "Exception out of range occurred ...";
    }
    catch (...)
    {
        qDebug() << "Unknown Exception occured...";
    }

    return a.exec();
}

std::out_of_range

It may be thrown by the member functions of std::bitset and std::basic_string, by std::stoi and std::stod families of functions, and by the bounds-checked member access functions (e.g. std::vector::at and std::map::at)

你的 try 街区没有这些东西。对纯 C 样式数组的越界访问是 undefined behaviour。正如您所经历的,这通常表现为崩溃。

读取或写入数组边界是未定义的行为。无法保证它会崩溃、抛出异常或做任何事情。这只是格式错误的代码。

如果你想要一个带有边界检查的类似数组的容器,标准库中有 std::array, std::vector, and perhaps std::deque。它们都有一个 at() 成员函数,可以进行边界检查并会抛出 std::out_of_range 异常。