c++ - Do - Try/Catch - While block 内部有 2 个函数

标签 c++ while-loop try-catch

我遇到了 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(&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; 写到一个永远不会读取的变量(本地拷贝)。

关于c++ - Do - Try/Catch - While block 内部有 2 个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25514338/

相关文章:

java - 停止并重新运行自身内部的线程

c++ - Visual Studio 2010 上的 VC++ : Release builds using debug heap

C++ 代码使用 .cpp 源代码编译,但不使用 .c

c++ - 数组 C++ 中每个 boolean 值 1 位

正在复制字符串 :while loop breaks on the first condtion only using C

while-loop - 在brainfuck中高效实现while循环

c++ - IMMDevice::Activate 缺少接口(interface)的返回代码

python-2.7 - 如何在 Jinja2 中模拟 while 循环

c++ - 省略号 try catch on c++

java - 为 catch block 内的对象添加日志记录