2014-02-13 1 views
0

Windows 탐색기를 사용하여 파일을 선택하여 XML 파일에서 데이터를로드해야합니다. 다른 형식, 다른 XML을 선택하면 catch 블록에서 예외를 가져와야합니다. 하지만 그렇지 않아 응용 프로그램이 실패합니다. 지금까지 작성한 코드는 다음과 같습니다. 내가 뭘 놓치고 있니? xml 메서드에서 readVehicles(QString fileName)의 실행을 보냅니다.포맷 파일 예외가 try catch 블록에 의해 무시되었습니다.

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); 
    } 

    //Owner 
    //**************************************************************** 
    QDomElement ownerElement = carNode.firstChildElement("Owner"); 

    //FirstName 
    QDomElement fNameElement = ownerElement.firstChildElement("FirstName"); 
    QString fName = fNameElement.text(); 


    //LastName 
    QDomElement lNameElement = fNameElement.nextSiblingElement("LastName"); 
    QString lName = lNameElement.text(); 



    //Address 
    QDomElement addressElement = lNameElement.nextSiblingElement("Address"); 
    QString address = addressElement.text(); 

    //append vehicle to the list 
    vehicles.append(newVehicle); 
    } 
} 

은과 시도-catch 블록은 on_actionOpen_triggered() 방법 당신은 마지막 네 문자가 QFile로 보내기 전에 QString".xml"을 경우 확인해야

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); 
      } 
     } 

    } 
} 
+0

'open()'은 파일이 성공적으로 열리면 true를 반환합니다. 잘못된 파일 형식이 감지 된 경우 코드에 대한 정보가 없습니다. – 0x499602D2

+0

@ 0x499602D2 잘못된 형식이 감지되었는지 확인하는 방법을 생각할 수 없습니다. 몇 가지 제안을 도와 주시겠습니까? 고맙습니다. – laura

+0

XML 파일 만 열 었는지 확인하고 싶습니까? – 0x499602D2

답변

관련 문제