【问题标题】:Terminate called after throwing an instance of std::exception抛出 std::exception 实例后调用终止
【发布时间】:2019-02-22 13:22:09
【问题描述】:

我是例外的新手,我试图改进我的一个朋友在面试中遇到的问题的解决方案。

我的朋友被要求构建一个程序,该程序将获取 2 个数组并找到一个数字,如果我们将它除以第一个数组的成员,我们将得到第二个数组的匹配余数。

在这种情况下,我可以在没有任何继承类的情况下使用 std::exception 吗?

CPP 文件

#include <iostream>
#include <exception>
#include "FindNumber.h" 


Finder::Finder() : m_num(0)
{}


int Finder::FindFirst(int* _divided, int* _leftOver, int _size)
{
    int indx = 0;

    while(indx < _size)
    {

        if (!_divided[indx])
        {
            throw("Can not divide by zero!!");
        }

        if (m_num % _divided[indx] != _leftOver[indx])
        {
            ++m_num;
            FindRest(_divided, _leftOver, _size);
            indx = 0;
        }

        ++indx;
    }

    return m_num;
}


int Finder::FindRest(int* _divided, int* _leftOver, int _size)
{
    int indx = 0;

    for(;;)
    {
        if (!_divided[indx])
        {
            throw("Can not divide by zero!!");
        }

        if (m_num % _divided[indx] != _leftOver[indx])  
        {
            ++m_num;
        }
        else
        {
            break;
        }
    }

    return m_num;
}

测试单元

#include <cstdio>
#include <iostream>
#include "FindNumber.h"
#include "mu_test.h"

#define SIZE 5

/****************************** FN_check1 ******************************/
UNIT(FN_check1) 

    int divided [SIZE] = {0, 4, 5, 6, 7};
    int leftOver [SIZE] = {2, 0, 3, 2, 1};
    Finder find1;

    try
    {   
        ASSERT_THAT(6 != find1.FindFirst(divided, leftOver, SIZE));
        ASSERT_THAT(8 == find1.FindFirst(divided, leftOver, SIZE));
    }
    catch(std::exception& e)
    {
        std::cout << e.what();
    }

END_UNIT


/****************************** FN_check2 ******************************/
UNIT(FN_check2) 

    int divided [SIZE] = {6, 12, 8, 10, 7};
    int leftOver [SIZE] = {0, 0, 4, 2, 5};
    Finder find1;


    ASSERT_THAT(6 != find1.FindFirst(divided, leftOver, SIZE));
    ASSERT_THAT(12 == find1.FindFirst(divided, leftOver, SIZE));

    std::cout << find1.FindFirst(divided, leftOver, SIZE) << std::endl;

END_UNIT




TEST_SUITE(FindNumber_test)

    TEST(FN_check1)
    TEST(FN_check2)

END_SUITE

提前谢谢...

【问题讨论】:

    标签: c++ exception try-catch


    【解决方案1】:

    您用来引发异常的如下行:

    if (!_divided[indx]) {
        throw("Can not divide by zero!!");
    }
    

    您正在throw 输入一个字符串(实际上是一个const char*),它显然不是从您稍后尝试捕获的std::exception 继承的。您可以尝试throw std::runtime_error("Can not divide by zero!!"); 或抛出std::invalid_argument,以更适合每种情况为准。 为什么发生异常的原因似乎可以从错误消息中得知。

    【讨论】:

    • 好的,谢谢,我可以抛出 std::exception 吗?还是应该构建一个继承自 std::exception 的类并将 const char* 作为参数?
    • @sexymf 你可以,但通常不应该。不太清楚,甚至不是每个人都同意捕捉std::exception。是什么迫使你将 `std::exception 扔给它的一个孩子?
    • 没什么,我终于发现 std::runtime_error 是一个令人满意的解决方案,tnx。
    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2019-05-04
    • 2018-01-06
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多