2015-10-29 10 views
3

Я пытаюсь поймать исключение типа char * в main(), но программа вылетает со следующим сообщением: завершение вызова после вызова экземпляра 'char const *' код:Как перехватить char * исключения в C++

#include <iostream> 

int main() 
{ 
    char myarray[10]; 
    try 
    { 
     for (int n=0; n<=10; n++) 
     { 
      if (n>9) 
      throw "Out of range"; 
      myarray[n]='a'; 
     } 
    } 
    catch (char * str) 
    { 
     std::cout << "Exception: " << str << std::endl; 
    } 
    return 0; 
} 

ответ

8

Использование Const:

catch (const char * str) 
    { 
     std::cout << "Exception: " << str << std::endl; 
    } 
+3

Это на самом деле правильный ответ. Строковый литерал - 'const', поэтому его нужно поймать как таковую. Другие ответы (о построении и метании 'std :: exception' или производных типов) являются хорошим стилем, но отвечают на другой вопрос. – Peter

3

Предпочитают исключение:

try { 
    for (int n=0; n<=10; n++) { 
     if (n>9) throw std::runtime_error("Out of range"); 
     myarray[n]='a'; 
    } 
} catch (std::exception const& e) { 
    std::cout << "Exception: " << e.what() << std::endl; 
} 
+0

Если я пытаюсь бросить int l не могу его поймать –

+0

Вы не ответили на вопрос. –

0

Библиотека C++ Standard предоставляет базовый класс, специально предназначенный для объявления объектов, которые будут выбраны как исключения. Он называется std :: exception и определяется в заголовке. Этот класс имеет функцию виртуального члена, называемую тем, что возвращает последовательность символов с нулевым символом (типа char *) и которая может быть перезаписана в производных классах, чтобы содержать какое-то описание исключения.

// using standard exceptions 
#include <iostream> 
#include <exception> 
using namespace std; 

class myexception: public exception 
{ 
    virtual const char* what() const throw() 
    { 
    return "My exception happened"; 
    } 
} myex; 

int main() { 
    try 
    { 
    throw myex; 
    } 
    catch (exception& e) 
    { 
    cout << e.what() << '\n'; 
    } 
    return 0; 
} 

Для получения дополнительной помощи: http://www.cplusplus.com/doc/tutorial/exceptions/

+2

Вы не ответили на вопрос. –

-3

Вы не можете бросить строку, как это, вам нужно создать объект.

Заменить throw "Out of range" на throw std::out_of_range("Out of range")

С уважением,

+3

Вы ошибаетесь. Вы можете бросить все, что захотите. –

1

Вы не хотите поймать char*.

Я не знаю, откуда эта идея исходит из этих строковых литералов: char*: они не.

Строковые литералы const char[N], который распадается до const char*.

Catch const char*.

Ваша программа прекращается, потому что в настоящее время вы фактически не обрабатываете свое исключение!

Смежные вопросы