Предоставленный пример кода возвращает случайное число даже после выдачи исключения (код предоставлен) - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть пример кода для изменения и обработки исключений. Проблема в том, что даже после того, как я сгенерировал исключение, код все еще возвращает случайный 0. Я потратил некоторое время, пытаясь выяснить, почему у меня все еще возвращается 0, но я не смог найти ответ. У кого-нибудь есть идея, почему код ведет себя так?

#include <stdexcept>
#include <iostream>
#include <string>

using namespace std;


struct myException_Product_Not_Found : exception 
{
     virtual const char* what() const throw() {
        return "Product not found";
     }
} myExcept_Prod_Not_Found;  

int getProductID(int ids[], string names[], int numProducts, string target) {
    for (int i=0; i<numProducts; i++)  {
       if(names[i] == target)
            return ids[i];          
    } 
    try {
       throw myExcept_Prod_Not_Found;   
    }
    catch (exception& e) {
       cout<<e.what()<<endl;     
    }                                       
}

// Sample code to test the getProductID function
int main() {
    int    productIds[] = {4,5,8,10,13};
    string products[]   = {"computer","flash drive","mouse","printer","camera"};

    cout << getProductID(productIds, products, 5, "computer") << endl;
    cout << getProductID(productIds, products, 5, "laptop") << endl;
    cout << getProductID(productIds, products, 5, "printer") << endl;

    return 0;
} 

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

getProductID не создает исключение. Вы ловите исключение, которое вы бросаете, прежде чем getProductID сможет его сгенерировать. Таким образом, вы вернетесь ... ну ничего. Функции заканчиваются без вашего вызова return.

Если вы включили предупреждения вашего компилятора * (как и должно быть), компилятор должен предупредить с помощью сообщения типа control reaches end of non-void function g++, кажется, возвращает ноль в этом случае, но возвращение ноля, вероятно, неопределенное поведение.

Если вы хотите, чтобы функция генерировала исключение, не перехватывайте исключение, которое вы выбросили внутри функции. Переместите фиксатор наружу.

int getProductID(...) {
   ...
   throw myExcept_Prod_Not_Found;
}

string product = "computer";
try {
   cout << getProductID(productIds, products, 5, product) << endl;
} catch (exception& e) {
   cout << "Can't find product id for " << product << ": " << e.what() << endl;
}

* & mdash; Чтобы включить предупреждения в g++, -Wall является хорошей отправной точкой. @ Томалак Герет'кал предлагает -Wall -Wextra -std=c++98 -pedantic или -Wall -Wextra -std=c++0x -pedantic.

1 голос
/ 14 сентября 2011
try {
   throw myExcept_Prod_Not_Found;   
}
catch (exception& e) {
   cout<<e.what()<<endl;     
}  

Здесь вы бросаете исключение, а затем сразу же его ловите.Сообщение об исключении выводится на консоль, и затем выполнение вашей функции продолжается как обычно ... за исключением того, что вы не можете вернуть никакого значения.

Таким образом, результатом этого вызова функции является unspecified ,и вы видите какой-то произвольный мусор из памяти, а также вызываете неопределенное поведение .

Вместо этого просто позвольте исключению распространяться прямо вверх по стеку вызовов, не перехватывая его: это приведет вас кпрограмма для завершения (возможно, без фактического развертывания, между прочим):

throw myExcept_Prod_Not_Found;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...