Я хорошо знаком с C и знаю основы C++ и g++ для выполнения моего кода. Я пытаюсь проверить исключения в C++. Мой код внутри раздела try - это в основном код C. Я написал:
try{
....
}
catch (std::exception& e)
{
std::cerr << "exception caught: " << e.what() << '\n';
}
В разделе try я попробовал пару плохого кода:
char str[3];
free(str); // Memory Violation
это дало мне ошибку сегментации и завершение программы
while(1); // stack overflow
это продолжалось долго. Я сделал ^ c, чтобы прервать его
int x = 5/0; // divide by 0 exception
Это дало мне некоторое случайное или нулевое значение.
int arr[5];
cout<<arr[100] // array out of bound
это дало мне некоторое количество мусора cout << arr [1000]///нарушение памяти
Это дало мне ошибку
Я не хочу использовать инструкцию throw. Я хочу защитить свой код, если я произвожу какую-либо случайную ошибку, моя программа должна поймать его, распечатать и перейти к следующей вещи.
Я много читал на веб-сайте. Я понимаю, что C++ не обрабатывает ошибку сегментации как исключение.
Мое большинство кода будет в C. В некоторых случаях я буду использовать std: vector/std: string Я не хочу использовать throw,
Здесь у меня есть пара вопросов:
1) невозможно C++ throw, исключение без использования команды throw или функции исключения. 2) Для тестирования моего кода я ищу пример, который вызывает переполнение стека, массив из связи, деление на ноль или любое исключение. Может кто-нибудь указать на некоторые примеры
3) является попыткой catch в C++ сделанных работах только для обработки исключений, специфичных только для STD?
Позже я также попытался использовать set_terminate и set_unexpected:
используя следующий код:
typedef void (*pfv)();
void my_terminate()
{ cout << "Call to my terminate" << endl; }
void my_unexpected()
{ cout << "Call to my unexpected" << endl; }
int Divisor()
{
int result;
result = number%num;
if (result == 0 && num < 21)
{
num+1;
Divisor();
if (num == 20 && result == 0)
{
return number;
}
}
else if (result != 0)
{
number++;
Divisor();
}
}
int main ()
{
pfv old_term = set_terminate(my_terminate);
pfv old_unex = set_unexpected(my_unexpected);
Divisor();
}
Это должно было привести результат к вызову my_unexpected через set_terminate
Но у меня возникла ошибка сегментации.
Я использовал g++ для запуска моих программ, и все, что я получаю, - это ошибка сегментации в результате в случае исключения.
Похоже, я пропускаю какое-то основное и важное исключение. нужны некоторые входы
Нет. В большинстве компиляторов вы можете отключить поддержку броска. Взаимодействие с C - одна из причин, почему вы, возможно, захотите это сделать; C вообще не поддерживает бросок.
В отличие от Java или С#, нет промежуточного интерпретатора кода, который обнаруживает эти условия, поэтому они не будут генерировать исключения, когда они происходят. C и C++ намного ближе к оборудованию; на уровне процессора нет никакой конструкции "броска" и разворачивания стека.
Нет. В C++ вы можете бросить что-нибудь; целые числа, указатели, ссылки, объекты... вы называете это. Вам необязательно расширять std :: exception. Причинение std :: exception полезно, когда вы сильно используете стандартные библиотеки, которые могут его бросить, но нет причин, по которым вы должны использовать его, если вы этого не хотите.