【问题标题】:Do - Try/Catch - While block with 2 functions insideDo - Try/Catch - While 块内部有 2 个函数
【发布时间】:2014-08-26 20:07:13
【问题描述】:

我遇到了 do try catch while block 的问题——我放了 2 个可以抛出异常的函数。用户应该输入 3 个参数(每个参数都有自己的要求)。当我输入错误的第一个参数时 - 循环运行良好 - 用户必须再次输入。问题是当我输入好的第一个参数,但第二个错误 - 我得到一个无限循环。

代码如下:

**main**:
int main()
{
    int DL;
    pair <bool,bool> DS;
    bool dobrze = true;

    do
    {
        try
        {
            DL = getDl(&dobrze);
            DS = getDS(&dobrze);
        }
        catch(int err_no)
        {
            cout << "Wrong parameter:";
            switch (err_no)
            {
                case 0: cout << " length.";
                    break;
                case 1: cout << " big letters.";
                    break;
                case 2: cout << " other characters.";
                    break;
            }
            cout << endl;
         }
     }while (dobrze == true);
}
**functions**
int getDl (bool dobrze)
{
    int dl;
    cout << "Length [1 - 64]: ";
    cin >> dl;

    if ( dl <= 0 || dl > 64 )
    {
        dobrze = false;
        throw 0;
    }

    dobrze = true;
    return dl;
}
//------------------------------
pair<bool,bool> getDS(bool dobrze)
{
    pair<bool,bool> ds;

    cout << "Big letters [0/1]: ";
    cin >> ds.first;

    if ( ds.first != 0 && ds.first != 1) 
    {
        dobrze = false;
        throw 1;
    }
    dobrze = true;
//-----------
    cout << "Other characters [0/1]: ";
    cin >> ds.second;

    if ( ds.second != 0 && ds.second != 1) 
        throw 2;

    dobrze = true;
    return ds;
}

这是什么原因?

【问题讨论】:

  • DL = getDl(&amp;dobrze); DS = getDS(&amp;dobrze); 为什么你传递dobrze的地址而不是dobrze本身?
  • 在流 IO 期间避免异常,改为使用一些适当的错误处理。另外,抛出一些 std::exception 或派生的东西。
  • 因为某人的手指很胖并且输入了不正确的内容而引发异常不是异常情况。因此,您不应该在这种情况下抛出异常。

标签: c++ while-loop try-catch


【解决方案1】:

这里的参数是一个指针。

DL = getDl(&dobrze);

这里不是:

pair<bool,bool> getDS(bool dobrze)

不幸的是,对于您的调试尝试,bool 是极少数从指向自身的指针隐式初始化的数据类型之一。实际上你的电话是

DL = getDl((bool)(&dobrze));

相同
DL = getDl(nullptr != &dobrze);

这只是

DL = getDl(true);

您的程序中没有任何内容可以更改 main 中的 dobrze 变量并结束循环。

您可以通过打开警告来发现这一点...您的编译器应该已经通知您 dobrze = true;dobrze = false; 行写入了一个永远不会读取的变量(本地副本)。

【讨论】:

    【解决方案2】:

    我不完全相信您对程序行为的描述。您的循环仅在执行到达底部时dobrzefalse 时终止,但您(尝试)在成功输入时设置该变量true。你只在输入错误时设置它false,就在抛出之前。

    即便如此,您的行为差异可能源于您没有在getDS() 中的第二个throw 之前设置dobrze。

    另外,正如@justanothercoder 所指出的,您正在将bool * 传递给您的函数,但他们期待bool 参数。这是完全错误的。您可以声明函数以接受bool *

    // Pass a pointer
    DL = getDl(&dobrze);
    
    // ...
    
    int getDl (bool *dobrze) {
        // ...
        *dobrze = true;
        // ...
    }
    

    或者你可以使用引用传递

    // just pass the variable ...
    DL = getDl(dobrze);
    
    // ...
    
    int getDl (bool &dobrze) {
        // otherwise unchanged ...
    }
    

    不过,我认为整个 dobrze 业务都是一派胡言,如果看起来,关键在于确定是否循环循环。您已经通过是否在内部捕获异常来知道这一点,那么为什么需要该变量?考虑围绕这种骨架构建:

    while (true) {
        try {
            DL = getDl();
            DS = getDS();
        } catch (int err_no) {
            // cycle the loop:
            continue;
        }
        // exit the loop:
        break;
    }
    

    【讨论】:

    • 只需将break; 放在try{} 块内即可。
    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2015-08-23
    相关资源
    最近更新 更多