C++ 提取try-catch时出现运行时错误

C++ 提取try-catch时出现运行时错误,c++,runtime,C++,Runtime,所有代码: /*如果我删除try-catch,将出现运行时错误。*/ 尝试 { 雪上冒险。多达基普拉图(尼斯维特,特宁1号,特宁1号,特宁); 雪上冒险。多达基普拉图(尼斯维特,特宁2号,特拉塔2号,特宁); 雪地探险。多达吉普拉图(尼斯维特,特宁3号,特宁3号,特宁); 雪地探险。多达吉普拉图(尼斯维特,特宁1号,奥普雷马,新墨西哥州,“奥普雷马”); 《雪地探险》多达吉普拉图(nisvet,trening_3,oprema_NM,“oprema”); } 捕获(常量标准::异常和对象) {

所有代码:

/*如果我删除try-catch,将出现运行时错误。*/
尝试
{
雪上冒险。多达基普拉图(尼斯维特,特宁1号,特宁1号,特宁);
雪上冒险。多达基普拉图(尼斯维特,特宁2号,特拉塔2号,特宁);
雪地探险。多达吉普拉图(尼斯维特,特宁3号,特宁3号,特宁);
雪地探险。多达吉普拉图(尼斯维特,特宁1号,奥普雷马,新墨西哥州,“奥普雷马”);
《雪地探险》多达吉普拉图(nisvet,trening_3,oprema_NM,“oprema”);
}
捕获(常量标准::异常和对象)
{
什么;
}
/*作用*/
void DodajUplatu(Ucenik&Ucenik、挖沟和挖沟、Uplata&Uplata、串svrha){
对于(int i=0;i<_treninzi.size();i++)
{
对于(int j=0;j<_treninzi[i].getUcenici().size();j++)
{
如果(*u treninzi[i].getUcenici()[j]==ucenik){
如果(svrha==“oprema”){
int size=_treninzi[i].getUcenici()[j]->getIznajmljenaOprema()->size();
bool uplaceno=false;
对于(int k=0;kgetIznajmljenaOprema())[k];
如果(oprema->getCijena()>=uplata.getIznos()){
_treninzi[i].getUcenici()[j]->DodajUplatu(uplata,svrha);
uplaceno=真;
返回;
}
}
如果(!uplaceno){
抛出异常(“Niste uplatili!”);
返回;
}
}
其他的
{
if(trening.getTipTreninga()==Pocetnicki){
if(uplata.getIznos()==trening.getBrojCasova()*10){
_treninzi[i].getUcenici()[j]->DodajUplatu(uplata,svrha);
返回;
}
否则{
抛出异常(“Niste uplatili dovoljno novca!”);
}
}
else if(trening.getTipTreninga()==rekretivini)
{
if(uplata.getIznos()==trening.getBrojCasova()*15){
_treninzi[i].getUcenici()[j]->DodajUplatu(uplata,svrha);
返回;
}
否则{
抛出异常(“Niste uplatili dovoljno novca!”);
}
}
其他的
{
if(uplata.getIznos()==trening.getBrojCasova()*20){
_treninzi[i].getUcenici()[j]->DodajUplatu(uplata,svrha);
返回;
}
否则{
抛出异常(“Niste uplatili dovoljno novca!”);
}
}
}
}
抛出异常(“Nepoznat ucenik koji je zaprimljen kao parametar!”);
}
}
}
说明如下:

一旦构造了异常对象,控制流就会工作 向后(向上调用堆栈),直到到达尝试的开始 块,此时关联捕捉块的参数 与抛出的表达式进行比较以找到匹配项。如果没有对手 找到时,控制流继续展开堆栈,直到 下一个试块,依此类推。如果找到匹配项,控制流将跳转 到匹配的catch块(异常处理程序),该块执行 通常

当控制流向上移动调用堆栈时,将调用析构函数 对于自 按与构造相反的顺序输入了相应的try块。 如果从构造函数引发异常,则调用析构函数 对于所有完全构造的非静态非变量构件和基础 上课。此过程称为堆栈展开

解释


从代码中删除try-catch块时调用了abort()

这意味着,如果您的代码抛出异常(函数
DodajUplatu
会),并且该异常未在try/catch块中处理(如果您删除它,则不会处理),则会调用
中止()
-运行时错误

用try-catch,效果非常好

是,因为此异常在catch块中被捕获


你应该阅读关于获取扩展信息的文章。 或者最好读一些。

说:

一旦构造了异常对象,控制流就会工作 向后(向上调用堆栈),直到到达尝试的开始 块,此时关联捕捉块的参数 与抛出的表达式进行比较以找到匹配项。如果没有对手 找到时,控制流继续展开堆栈,直到 下一个试块,依此类推。如果找到匹配项,控制流将跳转 到匹配的catch块(异常处理程序),该块执行 通常

当控制流向上移动调用堆栈时,将调用析构函数 对于自 按与构造相反的顺序输入了相应的try块。 如果从构造函数引发异常,则调用析构函数 对于所有完全构造的非静态非变量构件和基础 上课。此过程称为堆栈展开

解释


从代码中删除try-catch块时调用了abort()

这意味着如果你的
/*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!");
            }
        }

    }