Try / Catch & Throw не работает должным образом - PullRequest
0 голосов
/ 10 ноября 2011

Я не могу заставить мой try / catch работать правильно. Когда вы реализуете try / catch, предполагается, что он «выбрасывает» любую строку, которую вы ему сказали, верно? И если вы хотите, пусть программа продолжается. Ну, мой не говорит то, что я хочу, и не продолжает, вместо этого он говорит мне об этом, а затем прерывает:

Ошибка отладки !! Бла бла бла.exe R6010 -abort () вызван (Нажмите Retry для отладки приложения)

Я хочу сказать: «Вы пытаетесь добавить больше элементов, чем разрешено. Не делайте.», А затем продолжайте работу с программой. Это LinkedList, он не должен содержать более 30 узлов. Он останавливается, когда пытается добавить больше 30, но не так, как я хочу. Я не уверен, что я делаю не так, помогите очень признателен!

Main:
    Collection<int> list;

    for(int count=0; count < 31; count++)
    {       
        try
        {
            list.addItem(count);
            cout << count << endl;
        }
        catch(string *exceptionString)
        {
            cout << exceptionString;
            cout << "Error";
        }
    }
    cout << "End of Program.\n";

Collection.h:
template<class T>
void Collection<T>::addItem(T num)
{
    ListNode<T> *newNode;
    ListNode<T> *nodePtr;
    ListNode<T> *previousNode = NULL;

    const std::string throwStr = "You are trying to add more Items than are allowed. Don't. ";

    // If Collection has 30 Items, add no more.
    if(size == 30)
    {   
        throw(throwStr);
    }
    else
    {}// Do nothing.            

    // Allocate a new node and store num there.
    newNode = new ListNode<T>;
    newNode->item = num;
    ++size;

    // Rest of code for making new nodes/inserting in proper order
    // Placing position, etc etc.
} 

1 Ответ

4 голосов
/ 10 ноября 2011

Вы бросаете строку, но пытаетесь поймать указатель на строку.

Измените свой блок try / catch на:

try
{
...
}
catch( const string& exceptionString )
{
   cout << exceptionString;
}

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

К вашему сведению, более стандартный способ - бросить / перехватить объект std :: exception. т.е. * +1008 *

try
{
...
}
catch( std::exception& e )
{
   std::cout << e.what();
}


...

throw( std::logic_error("You are trying to add more Items than are allowed. Don't.") );
...