C++中的错误处理-试图返回到指定的语句
Error handling in C++ - Trying to go back to a specified statement
我在想,有没有什么方法可以在不关闭程序的情况下使用throw/try/catch?
例如:
function
{
restore point:
//code goes here
try "something";
goto restore point;
}
是否有任何方法可以调用函数,如果try语句中未验证条件,则返回标识符?
这是我的案例:
int Automat::Retragere()
{
int suma;
cout<<"n Introduceti suma pe care doriti s-o retrageti: ";
cin>>suma;
if(suma > 5000){
throw "n Suma este mai mare decat plafonul maximal zilnic.";
}
else{
if(suma > sold){
throw "n Suma este mai mare decat SOLDUL curent.";
}
else{
cout<<"Operatiune efectuata cu succes.";
sold = sold - suma;
return 1;
}
}
}
marcaj2:
//code here
switch(optiune){
case 1:
Retragere();
goto marcaj2;
case 2:
Depunere();
goto marcaj2;
case 3:
Transfer();
goto marcaj2;
default:
break;
}
我在问,在调用"Retragere"函数后,如果try遇到错误,是否有可能返回到我的标识符。
在您演示的情况下,Automat::Retragere
可能不应该抛出任何异常,而应该返回描述错误的错误代码,因为"输入太大"(大于允许值或大于帐户总和)并不是真正的异常状态。使用一个带有说出名称的枚举,而不是普通的int
。有了一个简单的返回值,你就可以自由地使用普通的控制流,比如while循环输入,直到数字被允许为止。
设计插曲:如果这是一个期望经过净化的输入的例程,那么这些条件表明程序错误,那就不一样了。事实上,在这个阶段,可能已经将数据采集与业务逻辑分开了。
这意味着一个函数负责获取输入并对其进行检查;另一个函数需要有效的输入(没有字符串,而是一个指示有效金额的数字),并执行实际的业务操作,如提款或存款。这只是一句话,但在现实世界中可能涉及建立某种连接、身份验证等。
当提供一个无效的数字时,业务函数可能会抛出,因为数据提供程序违反了其约定。
关于你的问题的技术方面:2011年标准在15/3:中说
goto、break、return或continue语句可用于传输try块或处理程序之外的控件。
我无法想象有任何普通的理由这样做,但这并不违法。(围绕goto
的一些规定,甚至可以说是goto
本身,目标机器生成的代码或类似场景。)
很可能在本地处理某些异常;一种更明智的方法(比直接从catch块内部到函数中某个地方的goto
更明智)是将try/catch块放在循环中。catch块将检查异常,并设置一个错误代码,然后在循环条件中进行检查,或者可能重新抛出未知或严重到无法从本地恢复的异常。
这就是您想要的吗?
bool done = false;
while (!done)
{
//marcaj2:
switch(optiune){
case 1:
Retragere();
break; // break out of the switch, i.e. will continue at while (!done)
// so it similar to goto marcaj2
case 2:
Depunere();
break;
case 3:
Transfer();
break;
default:
done = true; // end the while loop
break;
}
}
其他人已经评论说异常抛出很糟糕。
但如果你真的想要它,我想你可以这样做:
bool done = false;
while (!done)
{
try
{
//marcaj2:
switch(optiune){
case 1:
Retragere();
break; // break out of the switch, i.e. will continue at while (!done)
// so it similar to goto marcaj2
case 2:
Depunere();
break;
case 3:
Transfer();
break;
default:
done = true; // end the while loop
break;
}
}
catch (...)
{
// error handling...
}
}
- 返回语句后的代码,没有警告
- 三元运算符在返回语句中给出意外的结果
- 返回非 void 的函数中没有返回语句警告
- 如何使用单个返回语句返回对变量的引用
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 获取上次执行的返回语句的行
- 返回语句中矢量初始化时出现编译错误
- 快速搜索链表未编译,需要返回语句
- 静态成员函数赋值而不带返回语句
- 在返回语句中构造对象时,std::move() 是否有助于或阻止 RVO?
- 为什么返回语句和打印语句返回不同的答案?
- C++ 非 void 函数的崩溃没有返回语句
- 在返回语句中嵌套条件运算符
- 为什么结构化绑定禁用RVO和移动返回语句
- C - 程序返回值而无需返回语句
- 返回语句中的构造函数语法
- 编译器遇到返回语句时会做什么
- 是一个单一的返回语句清洁器
- C NRVO/复制Elision在括号中带有返回语句
- C 编译器 - 被遗忘的返回语句