从来没用过异常处理,所以对这方面不清楚,最近做qt工程,有考虑加入这个,但是我简单写个程序,发现,
#include "mainwindow.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <exception>
struct Node
{
int x;
int y;
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
edit = new QTextEdit;
QPushButton* btn = new QPushButton("start");
connect(btn, &QPushButton::clicked, this, &MainWindow::Slot);
resize(500, 500);
QWidget* w = new QWidget;
QVBoxLayout* lay = new QVBoxLayout;
lay->addWidget(btn);
lay->addWidget(edit);
w->setLayout(lay);
setCentralWidget(w);
}
MainWindow::~MainWindow()
{
}
void MainWindow::Slot()
{
try
{
Node* p = nullptr;
p->x = 1;
}
catch (std::exception& e)
{
edit->setText(e.what());
}
}
当按钮按下,Slot
函数调用,但实际运行,textedit框并未显示任何异常信息,程序也直接崩溃退出了。
我谷歌搜文章,大家写的,都是throw,然后try...catch。随后我让我的同事帮我写了一个相同的WPF程序,它检测到了。
所以我生出这样的怀疑:c++的异常处理机制只有throw才能catch到么?
求解释。
没错.
WPF 采用 .net 框架, 如果用 c# 实现同样的功能, 必定可以捕获异常.
若用 unmanaged code 实现, 也有可能捕获, 它得益于 windows SEH(结构化异常处理) 机制.
你也可以用 vc 的 __try/__catch 方式结合 qt 试一下.