我们有一个基于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();
}
以上是最小的示例。在上面,它使程序崩溃。 有办法解决吗?
答案 0 :(得分:1)
读取或写入数组边界是未定义的行为。不能保证它会崩溃,引发异常或根本不执行任何操作。只是格式错误的代码。
如果您想通过边界检查数组式容器,则标准库中有std::array
,std::vector
,甚至还有std::deque
。它们都有一个at()
成员函数,该函数会进行边界检查,并会抛出一个std::out_of_range
异常。
答案 1 :(得分:0)
回答您的问题:
“ C ++ try catch对于第三方库不起作用”
不! 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();
}
答案 2 :(得分:0)
它可能由
std::bitset
和std::basic_string
的成员函数,std::stoi
和std::stod
函数族以及由边界检查的成员访问函数抛出(例如std::vector::at
和std::map::at
)
您的try
块都没有这些内容。 undefined behaviour是对普通C样式数组的无限制访问。正如您所经历的那样,这通常表现为崩溃。