обработка исключений в C ++ никогда не перехватывает тип исключения baisc, всегда приводит к ошибке сегментации

0

Я хорошо знаком с 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++ для запуска моих программ, и все, что я получаю, - это ошибка сегментации в результате в случае исключения.

Похоже, я пропускаю какое-то основное и важное исключение. нужны некоторые входы

  • 4
    Неопределенное поведение не определено. Ни один из этих примеров не должен ничего делать.
  • 0
    в то время как (1); не переполнение стека, это бесконечный цикл
Показать ещё 3 комментария
Теги:
exception
throw
g++
segmentation-fault

1 ответ

1
  1. Нет. В большинстве компиляторов вы можете отключить поддержку броска. Взаимодействие с C - одна из причин, почему вы, возможно, захотите это сделать; C вообще не поддерживает бросок.

  2. В отличие от Java или С#, нет промежуточного интерпретатора кода, который обнаруживает эти условия, поэтому они не будут генерировать исключения, когда они происходят. C и C++ намного ближе к оборудованию; на уровне процессора нет никакой конструкции "броска" и разворачивания стека.

  3. Нет. В C++ вы можете бросить что-нибудь; целые числа, указатели, ссылки, объекты... вы называете это. Вам необязательно расширять std :: exception. Причинение std :: exception полезно, когда вы сильно используете стандартные библиотеки, которые могут его бросить, но нет причин, по которым вы должны использовать его, если вы этого не хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню