c++的异常处理机制是只有throw才能catch到么?

从来没用过异常处理,所以对这方面不清楚,最近做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到么?

求解释。

阅读 2.4k
1 个回答

没错.

WPF 采用 .net 框架, 如果用 c# 实现同样的功能, 必定可以捕获异常.
若用 unmanaged code 实现, 也有可能捕获, 它得益于 windows SEH(结构化异常处理) 机制.

你也可以用 vc 的 __try/__catch 方式结合 qt 试一下.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题