Обработка исключений - PullRequest
       0

Обработка исключений

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

Извините, я не предоставил код при публикации ранее из-за отступа. Теперь я предоставляю код. Как я упоминал ранее, я создал исключение внутри примера кода, и у меня все еще есть 0, которое возвращается кодом. Я потратил несколько раз, пытаясь выяснить, но я не мог прийти с точным ответом.

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

using namespace std; 


class myException_Product_Not_Found: public exception  
{ 
    public: 
      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;      
    }                                        
} 

int main() //sample code to test the getProductID function 
{ 
  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; 
}  

c ++ исключение

Ответы [ 2 ]

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

Вы ловите исключение, фактически говоря, что вы обрабатываете его с сообщением, напечатанным для cout.

Это перезапустит исключение, если вы хотите его распространить.

try 
{ 
 throw myExcept_Prod_Not_Found;    
} 
 catch (exception& e) 
{ 
 cout<<e.what()<<endl;      
 throw;
} 

Если вы не хотите возвращать 0 из своей основной функции после распространения, вы должны сделать это самостоятельно.

int main()
{ 
  try {
    // ...
  } catch (...) {
    return 1;
  }   
  return 0; 
}
0 голосов
/ 14 сентября 2011

Ваша getProductID() функция не возвращается из всех возможных путей выполнения. Поэтому, когда функция завершается без оператора return, вы получаете случайный мусор. Это тот случай, когда строка продукта не найдена.

Ваш блок try / catch - это красная сельдь, так как он никак не влияет на остальную часть кода (исключение ловится сразу).

Два несвязанных совета по улучшению:

  1. Перехват исключений по константной ссылке.

  2. Используйте std::find вместо вашей ручной петли; таким образом, вы можете написать все тело функции в две строки.

  3. Не используйте массивы в стиле C; вместо этого используйте std::vector.

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