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