debugging 如何让我的程序注册try/catch程序中的第二个错误[已关闭]

nzk0hqpo  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(107)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
这篇文章是昨天编辑并提交审查的。
Improve this question
我是c++新手,我有一个try/catch程序,但是每当我试图测试第二个catch块看它是否捕获了相关的throw语句时,程序就会打印第一个catch块的消息,代码如下:
我试过将特定的错误(比如std::invalid_argument)改为更一般的错误,比如std::exception,但是对于我的错误信息来说,这还不够具体。这是一个类,代码必须考虑到用户输入不是数字,或者不是数字1 - 4。

//c++

/*For context, choice is an integer from
User input that is supposed to be a number 1-4.*/

void search() {
    int choice;
    std::cout << "Search by:\n1:Title\n2:Year\n3:Actor\n4:Rating\n";
    
    try {
        std::cin >> choice;
        if(!isdigit(choice)) {
            throw std::invalid_argument("Please type a number. \n");
        } 
        if(choice >= 5 || choice <= 1) {
            throw out_of_range("Please input a number between 1 and 4");
        }
    }
    catch(std::out_of_range const& e){
        std::cout << e.what();
        cin.clear();
    }
    catch(std::invalid_argument const& e) {
        std::cout << e.what();
    }

对不起,如果它不是最好的,我还在学习。问题是out_of_range catch语句在抛出时不打印错误消息。我只得到invalid_argument抛出/捕获响应。

sauutmhj

sauutmhj1#

这条线

if(!isdigit(choice)) {

并不像你想的那样。它返回一个字符代码,比如'x'(ASCII格式为120)或'4'(ASCII中的52)是否为数字。(即对于'0''9'之间的所有字符代码返回真)。但是choice不表示字符代码,它表示用户以整数形式键入的数字。
如果我没记错的话,如果输入的不是一个有效的整数,choice将是0,在这种情况下,您可以将代码保持为:

try {
        std::cin >> choice;
        if(choice >= 5 || choice <= 1) {
            throw out_of_range("Please input a number between 1 and 4");
        }
    }
    catch(std::out_of_range const& e){
        std::cout << e.what();
        cin.clear();
    }

相关问题