gpt4 book ai didi

c++ - Qt/C++ 错误处理

转载 作者:IT老高 更新时间:2023-10-28 12:43:06 27 4
gpt4 key购买 nike

我一直在做很多关于使用 Qt/C++ 处理错误的研究,但我仍然像刚开始时一样迷茫。也许我正在寻找一种简单的出路(就像其他语言提供的那样)。一个,特别是,提供了一个我虔诚地使用的未处理的异常。当程序遇到问题时,它会抛出未处理的异常,以便我可以创建自己的错误报告。该报告从我的客户机器发送到在线服务器,然后我稍后再阅读。

我在使用 C++ 时遇到的问题是,必须先考虑已完成的任何错误处理(想想 try/catch 或大量条件)。根据我的经验,代码中的问题是事先没有想到的,否则一开始就不会有问题。

在没有跨平台错误处理/报告/跟踪机制的情况下编写跨平台应用程序对我来说有点可怕。

我的问题是:是否有任何类型的 Qt 或 C++ 特定的“包罗万象”错误捕获机制可以在我的应用程序中使用,这样,如果确实出现问题,我至少可以在它之前写一份报告崩溃?

例子:


class MainWindow: public QMainWindow
{
[...]

public slots:
void add_clicked();
}

void MainWindow::add_clicked()
{
QFileDialog dlg(this, Qt::Sheet);
QString filename = dlg.getOpenFileName(this);

if(!filename.isEmpty())
{
QStringList path = filename.split(QDir::separator());
QString file = path.at(path.count()); // Index out of range assertion.

if(!lst_tables->openDatabase(filename))
{
[...]
}
}
}

我希望将此错误作为未处理的异常捕获,并在不向用户显示 Windows/Mac 操作系统上的默认崩溃窗口的情况下退出应用程序。我只是希望它在将断言消息写入文件等后很好地退出。

最佳答案

覆盖 QCoreApplication::notify()并在那里添加try-catch。根据我的经验,main() 中的内容涵盖了大多数情况。

这是我的做法。请注意,我在这里使用的是 C++ RTTI,而不是 Qt 的版本,但这只是为了方便我们的应用程序。此外,我们建立了一个 QMessageBox,其中包含信息和指向我们的日志文件的链接。您应该根据自己的需要进行扩展。

bool QMyApplication::notify(QObject* receiver, QEvent* even)
{
try {
return QApplication::notify(receiver, event);
} catch (std::exception &e) {
qFatal("Error %s sending event %s to object %s (%s)",
e.what(), typeid(*event).name(), qPrintable(receiver->objectName()),
typeid(*receiver).name());
} catch (...) {
qFatal("Error <unknown> sending event %s to object %s (%s)",
typeid(*event).name(), qPrintable(receiver->objectName()),
typeid(*receiver).name());
}

// qFatal aborts, so this isn't really necessary
// but you might continue if you use a different logging lib
return false;
}

此外,我们在 Windows 上使用 __try、__except 来捕获异步异常(访问冲突)。 Google Breakpad 可能会成为它的跨平台替代品。

关于c++ - Qt/C++ 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4661883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com