Прекращение вызывается после создания экземпляра std :: exception - PullRequest
0 голосов
/ 22 февраля 2019

Я новичок в исключениях, и я попытался улучшить решение вопроса, который был у одного из моих друзей на собеседовании.

Моего друга попросили создать программу, которая получит 2 массива и найдетчисло, которое, если мы разделим его на члены первого массива, мы получим соответствующий остаток второго массива.

Могу ли я использовать std :: exception без каких-либо наследуемых классов в этом случае?

ФАЙЛ СРР

#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

Заранее спасибо ...

1 Ответ

0 голосов
/ 22 февраля 2019

Строки, подобные приведенным ниже, которые вы используете для выдачи исключений:

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, в зависимости от того, что подходит для каждой ситуации. Почему возникает исключение, по-видимому, известно из сообщения об ошибке.

...