Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在抛出std::exception实例后调用Terminate_C++_Exception_Try Catch - Fatal编程技术网

C++ 在抛出std::exception实例后调用Terminate

C++ 在抛出std::exception实例后调用Terminate,c++,exception,try-catch,C++,Exception,Try Catch,我不熟悉例外情况,我试图改进一个解决我一个朋友在工作面试中遇到的问题的方法 我的朋友被要求构建一个程序,它将得到2个数组并找到一个数字,如果我们将它除以第一个数组的成员,我们将得到第二个数组的匹配剩余部分 在这种情况下,我可以在没有任何继承类的情况下使用std::exception吗 CPP文件 #include <iostream> #include <exception> #include "FindNumber.h" Finder::Finder() : m_

我不熟悉例外情况,我试图改进一个解决我一个朋友在工作面试中遇到的问题的方法

我的朋友被要求构建一个程序,它将得到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;
}
#包括
#包括
#包括“FindNumber.h”
Finder::Finder():m_num(0)
{}
int Finder::FindFirst(int*_分割,int*_剩余,int大小)
{
int indx=0;
而(indx<_尺寸)
{
如果(!\u除以[indx])
{
抛出(“不能被零除!!”;
}
如果(m_num%\u除以[indx]!=\u剩余[indx])
{
++m_num;
FindRest(_分割,_剩余,_大小);
indx=0;
}
++indx;
}
返回m_num;
}
int Finder::FindRest(int*\u分割、int*\u剩余、int\u大小)
{
int indx=0;
对于(;;)
{
如果(!\u除以[indx])
{
抛出(“不能被零除!!”;
}
如果(m_num%\u除以[indx]!=\u剩余[indx])
{
++m_num;
}
其他的
{
打破
}
}
返回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
#包括
#包括
#包括“FindNumber.h”
#包括“mu_test.h”
#定义尺寸5
/******************************FN_检查1******************************/
单位(FN_检查1)
整除[大小]={0,4,5,6,7};
int leftOver[SIZE]={2,0,3,2,1};
发现者1;
尝试
{   
断言(6!=find1.FindFirst(已分割、剩余、大小));
断言(8==find1.FindFirst(已分割、剩余、大小));
}
捕获(标准::异常&e)
{

std::cout用于抛出异常的行,如下所示:

if(!\u除以[indx]){
抛出(“不能被零除!!”;
}

您正在抛出一个字符串(实际上是一个
const char*
),它显然不是从您稍后尝试捕获的
std::exception
继承的。您可以尝试抛出std::runtime\u错误(“不能被零除!!”)
或抛出一个
std::invalid_参数
,以更适合于每种情况的参数为准。错误消息似乎知道异常发生的原因。

好的,谢谢,我可以抛出std::exception吗?或者我应该构建一个从std::exception继承的类并获取const char*作为参数吗?@sexymf可以,但通常可以不应该。不太清楚,甚至不是每个人都同意捕获
std::exception
。是什么迫使你将'std::exception'扔给它的一个孩子?没什么,我最终发现std::runtime\u错误是一个令人满意的解决方案,tnx。