Как ловить Semetation fault c++?

У меня есть код на питоне:

def mylen(list):
    tmp = 0
    i = 0
    while True:
        try:
            tmp = l[i] #пытаемся присвоить переменной tmp значение списка
            i+=1
        except IndexError: #если i вышло за размеры списка - завершаем цикл
            break
    return i

И я хочу перенести его на c++:

int arrlen(int data[]){
    int tmp, i = 0;
    while (true){
        try {
            tmp = data[i];
        } catch () {
            break;
        }
        i++;
    }
}

Но я не понимаю что нужно написать в скобочках catch, чтобы ловить IdexError (Semetation fault/SIGSEGV)? Возможно, нужно использовать throw, но какое исключение он должен генерировать чтобы быть пойманным catch?


Ответы (1 шт):

Автор решения: user7860670

Никак. try / catch в С++ служит для перехвата исключений, бросаемых оператором throw. А выход за пределы массива и другие ситуации, грозящие SIGSEGV, в С++ обязан не допускать программист.

Если хочется допускать выход за пределы массива, но с генерацией исключения, то следует использовать один из стандартных классов std::vector / std::array и метод at, который будет генерировать исключение std::out_of_range:

::std::vector<int> items{};
try
{
    int tmp{items.at(::std::size_t{42})};
}
catch (::std::out_of_range const & exception)
{
    ::std::cout << exception.what() << ::std::endl;
}

Еще стоит пояснить, что int data[] в примере из вопроса не является массивом. Это указатель. Узнать, на какое количество элементов указывает не нулевой указатель (и указывает ли вообще) в С++ невозможно.

→ Ссылка