【问题标题】:Looping try...catch... to make sure input is valid or use control statements?循环 try...catch... 以确保输入有效或使用控制语句?
【发布时间】:2018-02-20 17:50:13
【问题描述】:

我对 try...catch... 的用法有疑问。 我想知道如何在用户输入错误数据并且需要在程序继续之前进行更正等情况下充分利用 try....catch...。在第一个代码中,我不能在没有循环的情况下继续使用,如果我想使用循环,我可以简单地使用 if...else... 进行错误检查,就像第二个代码一样。我真的需要 try...catch... 吗?

int size;
try
{
    cin >> size;
    Stack stack(size); //create a Stack(int) object.
}
catch(InvalidStackSize e)
{
    cerr << "Invalid size for stack.\n";
    continue; //What should I do here to ensure a stack with right size is entered before proceeding with rest of the program?
}

在第二个代码中,我使用带有 if...else... 的循环语句。如果我总是需要循环来获得正确的用户输入,为什么要使用 try...catch... ?

int size;
Stack stack;
do
{
    cin >> size;
    if( size == 0 )
        continue;
    else
    {
        Stack tmp(size);
        stack = tmp;
        break;
    }
}while(true);

【问题讨论】:

  • 您应该只对异常行为使用异常。一个简单的 if 条件可以在这里工作。所以你的答案是否定的。
  • 您可能应该创建一个函数int get_integer_until_non_zero() 来摆脱主代码中的while 循环:Stack stack{get_integer_until_non_zero()};
  • 异常应该仅限于处理异常情况。输入错误的用户也不例外。
  • “为什么要使用 try catch?” 在解决任何特定问题时,很少有 C++ 功能是强制性的。您是否就这个话题征求意见?
  • @DrewDormann 希望确保我没有遗漏任何 try catch 功能...

标签: c++ error-handling try-catch


【解决方案1】:

Exceptions 用于异常行为而不是错误检查(编译时错误)Exceptions 发生在指令执行过程中,一旦发生异常,如果您没有正确处理这些异常,那么下一条指令将不会被执行并且进程会停止。

来自C++ Standard

异常处理提供了一种转移控制和 从线程执行点到异常的信息 与执行之前传递的点相关联的处理程序。

为了处理这些异常,C++ 建议使用trythrowcatch 进行异常处理。

对于下面的代码exception handling 不是必需的,因为代码的任何指令都不会导致任何exceptionruntime error,要处理编译时错误,您可以像以前一样使用if..else

do
{
    cin >> size;
    if( size == 0 )
        continue;
    else
    {
        Stack tmp(size);
        stack = tmp;
        break;
    }
}while(true);

【讨论】:

  • 如果我创建一个 size = 0 的堆栈,我仍然不会得到编译错误...我应该在构造函数中使用此代码以确保输入正确的输入还是只设置堆栈大小 = 1如果输入了 0?
  • 如果用户输入大小为zeronegative value,您应该使用普通的if/else 语句处理。在构造函数中如果收到sizezero,则不要创建stack
猜你喜欢
  • 2023-03-21
  • 2023-03-05
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多