2017-08-22 4 views
0

Tout le code: https://pastebin.com/k7TZzQEYerreur d'exécution quand j'extrais try-catch

/*If i remove try catch runtime error appear.*/ 
try 
    { 
     SnowAdventure.DodajUplatu(nisvet, trening_1, uplata_1, "trening"); 
     SnowAdventure.DodajUplatu(nisvet, trening_2, uplata_2, "trening"); 
     SnowAdventure.DodajUplatu(nisvet, trening_3, uplata_3, "trening"); 
     SnowAdventure.DodajUplatu(nisvet, trening_1, oprema_nm, "oprema"); 
     SnowAdventure.DodajUplatu(nisvet, trening_3, oprema_NM, "oprema"); 

    } 
    catch (const std::exception& obj) 
    { 
     obj.what(); 

    } 
/*Function*/ 
void DodajUplatu(Ucenik & ucenik, Trening & trening, Uplata & uplata, string svrha) { 
     for (int i = 0; i < _treninzi.size(); i++) 
     { 
      for (int j = 0; j < _treninzi[i].getUcenici().size(); j++) 
      { 
       if (*_treninzi[i].getUcenici()[j] == ucenik) { 
        if (svrha == "oprema") { 
         int size = _treninzi[i].getUcenici()[j]->getIznajmljenaOprema()->size(); 
         bool uplaceno = false; 
         for (int k = 0; k < size; k++) 
         { 
          Oprema * oprema = &(*_treninzi[i].getUcenici()[j]->getIznajmljenaOprema())[k]; 
          if (oprema->getCijena() >= uplata.getIznos()) { 
           _treninzi[i].getUcenici()[j]->DodajUplatu(uplata, svrha); 
           uplaceno = true; 
           return; 
          } 
         } 
         if (!uplaceno) { 
          throw exception("Niste uplatili!"); 
          return; 
         } 
        } 
        else 
        { 
         if (trening.getTipTreninga() == Pocetnicki) { 
          if (uplata.getIznos() == trening.getBrojCasova() * 10) { 
           _treninzi[i].getUcenici()[j]->DodajUplatu(uplata, svrha); 
           return; 
          } 
          else { 
           throw exception("Niste uplatili dovoljno novca!"); 
          } 
         } 
         else if(trening.getTipTreninga()==Rekreativni) 
         { 
          if (uplata.getIznos() == trening.getBrojCasova() * 15) { 
           _treninzi[i].getUcenici()[j]->DodajUplatu(uplata, svrha); 
           return; 
          } 
          else { 
           throw exception("Niste uplatili dovoljno novca!"); 
          } 
         } 
         else 
         { 
          if (uplata.getIznos() == trening.getBrojCasova() * 20) { 
           _treninzi[i].getUcenici()[j]->DodajUplatu(uplata, svrha); 
           return; 
          } 
          else { 
           throw exception("Niste uplatili dovoljno novca!"); 
          } 
         } 
        } 
       } 
       throw exception("Nepoznat ucenik koji je zaprimljen kao parametar!"); 
      } 
     } 

    } 
+0

S'il vous plaît ** [modifier] ** votre question avec un [mcve] ou [SSCCE (court, autonome, exemple correct)] (http://sscce.org) – NathanOliver

+0

Quelle est l'erreur? – Cid

+0

En bref, Quelle erreur obtenez-vous? – Raindrop7

Répondre

2

cppreference.com dit ce qui suit:

Une fois l'objet d'exception est construit, le fonctionnement flux de contrôle vers l'arrière (la pile d'appel) jusqu'à ce qu'il atteigne le début d'un bloc try, à quel point les paramètres des blocs catch associés sont comparés à l'expression lancée pour trouver une correspondance. Si aucune correspondance n'est trouvée, le flux de contrôle continue à dérouler la pile jusqu'au prochain bloc try , et ainsi de suite. Si une correspondance est trouvée, le flux de contrôle saute vers le bloc catch correspondant (le gestionnaire d'exception), qui exécute normalement. Lorsque le flux de contrôle monte dans la pile d'appel, les destructeurs sont invoqués pour tous les objets ayant une durée de stockage automatique construits depuis l'entrée du bloc d'essai correspondant , dans l'ordre inverse de la construction. Si une exception est générée par un constructeur, les destructeurs sont appelés pour tous les membres non-variants non-statiques entièrement construits et les classes de base . Ce processus est appelé déroulement de la pile.

Explication

abort() a été appelé quand je supprimer bloc catch try à partir du code

Cela signifie que si votre code génère une exception (fonction DodajUplatu fait), et cette exception n'est pas gérée dans try/catch block (ce n'est pas si vous l'enlevez), une erreur d'exécution abort() est appelée.

avec prise d'essai, il fonctionne parfaitement

Oui parce que cette exception a été pris dans le bloc catch.


Vous devriez lire environ exceptions pour obtenir plus d'informations. Ou mieux lire quelques C++ book.