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