2015-10-01 3 views
-1

У меня очень трудное время, чтобы понять обработку исключений после просмотра онлайн-уроков и чтения на нем. Я пытаюсь пройти тестовое развитие, и я не могу. То, что я придумал до сих пор, это. Я должен использовать эту структуруИмея трудное понимание времени обработки исключений C++

struct ArrayException 
{ 
    ArrayException(string newMessage = "error") :message(newMessage) 
    { 
    } 

    string message; 
}; 

Первая попытка.

int sum(int* theArray, unsigned int arraySize) 
{ 
    try 
    { 

     if (theArray = NULL) 
     { 
      throw ArrayException("NULL ARRAY REFERENCE"); 
     } 
    } 
    catch (int* param) 
    { 
     cout << "you can't have " << param << " as an array size"; 
    } 
    int sum = 0; 
    for (int i = 1; i < arraySize; i++) 
    { 
     sum += theArray[i]; 
    } 
    return sum; 
} 

Я также пробовал делать это таким образом.

int sum(int* theArray, unsigned int arraySize) 
{ 

    if (theArray = NULL) 
    { 
     throw ArrayException("NULL ARRAY REFERENCE"); 
    } 
    else 
    { 
     int sum = 0; 
     for (int i = 1; i < arraySize; i++) 
     { 
      sum += theArray[i]; 
     } 
     return sum; 
    } 
} 
+2

Проблемы в том, что вы являетесь catch 'int *' вместо ArrayException, кстати гораздо лучше, если класс исключения наследуется от std :: exception, чтобы иметь базовые функциональные возможности исключения. – NetVipeC

+0

@NetVipeC, нет, не из-за этого (в них мало функциональности). Это лучше, потому что таким образом исключение может быть уловлено ссылкой на эти базовые типы, и приложения должны иметь улов для них по умолчанию. – SergeyA

+5

Пожалуйста, не пытайтесь выучить C++ из видеоуроков. Это худший путь. Пойдите, прочитав хорошую книгу, и оставьте ее за своим столом в качестве справочной информации, которую вы можете возвращать каждый раз, когда вам нужно. –

ответ

3

В то время как сообщение специально не упоминает об этом, я полагаю, что вопрос в том, почему исключение не поймано? Ответ прост - поскольку исключение выбрано типа ArrayException, а catch выполняется с типом int *.

+0

Благодарим вас за время и ответы. Я думал, что улов произволен и не должен быть строкой – Sean

+0

@Sean - Вы также не хотите поймать строку. Вы хотите 'catch (параметр ArrayException)' – owacoder

0

Лучший способ получить доступ к этому материалу - это то, что рекомендуют: ῥεῥ ῥεῖ: получите хорошую книгу. Вот хорошее место, чтобы начать выбирать книги: The Definitive C++ Book Guide and List

Остальное - это блок кода с комментариями, где я решил, что они нужны.

#include <iostream> 
// removed the using namespace std; 
struct ArrayException 
{ 
    ArrayException(std::string newMessage = "error") : 
      message(newMessage) 
    { 
    } 

    std::string message; 
}; 

int sum(int* theArray, size_t arraySize) // change made here: 
    // size_t better suited than unsigned int for indexes 
{ 
    //throw std::out_of_range("BOOM!"); //uncomment to trigger a std::exception 
    //throw 42; // uncomment to trigger the unknown exception 

    if (theArray == NULL) 
    { 
     throw ArrayException("NULL ARRAY REFERENCE"); //perfect! 
    } 
    else 
    { 
     int sum = 0; 
     for (size_t i = 0; i < arraySize; i++) // changes made here: 
      // size_t not int to get rid of signed/unsigned conflict 
      // starting with array index 0, not 1 
     { 
      sum += theArray[i]; 
     } 
     return sum; 
    } 
} 

int main() 
{ 
    try 
    { 
     sum (NULL, 10); // NULL address to force the exception 
    } 
    catch (ArrayException & param) // catch the custom exception 
     // catch by reference where possible 
    { 
     std::cout << "This bad stuff happened: " << param.message << std::endl; 
    } 
    // extra stuff to show what can also be done 
    catch (std::exception & stdexcpt) // catch any standard exceptions and 
            // print their message 
    { 
     std::cout << "Standard exception thrown: " << stdexcpt.what() << std::endl; 
    } 
    catch (...) // catch anything else that was thrown and doesn't 
       // correspond to any expectation 
    { 
     std::cout << "No idea what happened." << std::endl; 
    } 
} 
Смежные вопросы