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();
}
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
异常。
我们有一个基于 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();
}
It may be thrown by the member functions of
std::bitset
andstd::basic_string
, bystd::stoi
andstd::stod
families of functions, and by the bounds-checked member access functions (e.g.std::vector::at
andstd::map::at
)
你的 try
街区没有这些东西。对纯 C 样式数组的越界访问是 undefined behaviour。正如您所经历的,这通常表现为崩溃。
读取或写入数组边界是未定义的行为。无法保证它会崩溃、抛出异常或做任何事情。这只是格式错误的代码。
如果你想要一个带有边界检查的类似数组的容器,标准库中有 std::array
, std::vector
, and perhaps std::deque
。它们都有一个 at()
成员函数,可以进行边界检查并会抛出 std::out_of_range
异常。