1

I'm new to exceptions and I tried to improve a solution for question that one of my friend had in a job interview.

My friend was asked to build a program which will get 2 arrays and find a number, which if we divide it by the members of the first array, we will get a matching leftover of the second array.

Can I use std::exception without any inheriting classes in this case?

THE CPP FILE

#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;
}

THE TEST UNIT

#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

Thanks in advance...

1 Answer 1

2

Lines like below that you use to throw exceptions:

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

You are throwing a string (actually a const char*), which obviously does not inherit from std::exception which you try to catch later on. You could try to throw std::runtime_error("Can not divide by zero!!"); or throw a std::invalid_argument, whichever is more appropriate for each situation. Why the exception occurs seems to be known by the error message.

Sign up to request clarification or add additional context in comments.

3 Comments

Ok thank you and can I throw std::exception instead? or should I build a class that inherits from std::exception and get const char* as argument?
@sexymf you could, but usually shouldn't. It's less clear and not everybody even agrees with catching std::exception. What compels you to throw `std::exception over one of its children?
Nothing, I finally found the std::runtime_error a satisfying solution, tnx.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.