Как ловить 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 шт):
Никак. 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[] в примере из вопроса не является массивом. Это указатель. Узнать, на какое количество элементов указывает не нулевой указатель (и указывает ли вообще) в С++ невозможно.