gpt4 book ai didi

c++ - Qt C++ QException 问题 : debug error

转载 作者:行者123 更新时间:2023-11-30 04:13:56 34 4
gpt4 key购买 nike

我想从 XML 文件中读取对象,我需要处理 2 个异常:无法打开文件和无法加载文件内容。 (格式不正确)我编写了以下函数来读取文件中的内容和 2 个异常类。问题是,当我运行我的应用程序时,我试图加载一个格式与 XML 不同的文件,而不是一条通知存在异常的友好消息,我有一个调试错误:abort() 被调用。我做得不好吗?阅读功能

QList<Vehicle> VehicleHelper::readVehicles(QString fileName){
QList<Vehicle> vehicles;
Vehicle newVehicle;
QFile file(fileName);
QDomDocument document;
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
throw FileCannotBeOpenException();
}
else{
if(!document.setContent(&file)){
throw InvalidXMLContentException();
}
file.close();
}

QDomElement root = document.firstChildElement();
QDomNodeList carElements = root.elementsByTagName("Car");
for(int i = 0; i < carElements.size(); i++){

QDomNode carNode = carElements.at(i);

QDomElement carElement = carNode.toElement();
QString carID = carElement.attribute("ID");

//if the idNumber is null, generate one
if(carID.isEmpty()){
QUuid newId = Vehicle::generateID();
newVehicle.setVehicleId(newId);
}
else {
QUuid id;
try{
id = QUuid::QUuid(carID);
} catch(QException &ex){
continue;
}


newVehicle.setVehicleId(id);
}
}

函数的调用

void MainWindow::on_actionOpen_triggered()
{
if(isModified){
QMessageBox msgBox;
QString message = "There are unsaved changes! Do you proceed? ";
msgBox.setWindowTitle("Save Changes");
msgBox.setText(message);
msgBox.addButton("Don't save",QMessageBox::NoRole);
msgBox.addButton(QMessageBox::Save);
msgBox.addButton(QMessageBox::Cancel);
msgBox.setIcon(QMessageBox::Question);
int result = msgBox.exec();
if(result == QMessageBox::Save){
VehicleHelper::writeVehicles(cars,filename);
msgBox.close();
} else {
QString fileName = QFileDialog::getOpenFileName(this,"Open file");
if(!fileName.isEmpty()){
setFileName(fileName);
QFile file(fileName);
try {
cars = VehicleHelper::readVehicles(fileName);
} catch(FileCannotBeOpenException &ex) {
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Critical);
msgBox.setWindowTitle("Message!");
msgBox.setText("Failed to open file");
msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.exec();
return;

} catch(InvalidXMLContentException &ex){
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Critical);
msgBox.setWindowTitle("Message!");
msgBox.setText("Failed to load data!");
msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.exec();
return;
}

setTakenNumbersList(cars);
//set data to the table view
populate(cars);
}
}
} else {
QString fileName = QFileDialog::getOpenFileName(this,"Open file");
if(!fileName.isEmpty()){
setFileName(fileName);
QFile file(fileName);
if(file.open(QFile::ReadOnly | QFile::Text)){
cars = VehicleHelper::readVehicles(fileName);
setTakenNumbersList(cars);
file.close();

//set data to the table view
populate(cars);

ui->actionAdd->setEnabled(true);
ui->actionBy_name->setEnabled(true);
ui->actionBy_registration_date->setEnabled(true);
ui->actionBy_registration_number->setEnabled(true);
ui->actionBy_revision_date->setEnabled(true);
ui->actionBy_type->setEnabled(true);
ui->actionClear_Search->setEnabled(true);
ui->actionDelete->setEnabled(true);
ui->actionEdit->setEnabled(true);
ui->actionSave->setEnabled(true);
ui->actionSave_As->setEnabled(true);
}
}

}
}

主要

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
try{
w.show();
} catch(QException &ex){

}
return a.exec();
}

最佳答案

异常是从事件循环中运行的代码中抛出的,特别是它们将到达QCoreApplication::notify()。这是通过介入的操作系统事件循环调用从 a.exec() 间接调用的。

因此,您不能仅仅将 a.exec() 包装在 try/catch 中。您必须按如下方式重新实现 QCoreApplication::notify():

class MyApplication : public QApplication
{
public:
MyApplication(int & c, char ** a) : QApplication(c,a) {}
virtual bool notify(QObject * obj, QEvent * ev) {
bool rc = true;
try {
rc = QApplication::notify(obj, ev);
}
catch (QException &ex) {
...
}
return rc;
}
};

int main(...) {
MyApplication app(...);
...
}

您的代码的另一个问题是它尖叫着使用 State Machine Framework .你应该有代表文件打开和关闭的状态,以及中间状态,例如显示“未保存的更改”对话框。这样您就不会在代码周围乱丢 ui->actionXYZ->setEnabled(true) 了。假设你有一个 fileOpen 状态,你会有

fileOpen->assignProperty(ui->actionBy_name, "setEnabled", true);
...

然后,当文件打开时,您会发出一个信号,该信号附加到状态机中的信号转换。状态机将完成剩下的工作——它将为您启用/禁用操作等。

关于c++ - Qt C++ QException 问题 : debug error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19144397/

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