У на самом деле нет исключений. Он имеет две вещи, которые играют аналогичную роль, но которые сильно отличаются друг от друга: сигналы и коды ошибок.
Рассмотрим сначала коды ошибок. Когда вызов функции в C завершается с ошибкой, он обычно сигнализирует об этом сбое вызывающему абоненту, возвращая код ошибки или возвращая значение заполнителя (например, 0, -1 или NULL) и устанавливая ошибку в errno
или сохраняя его в месте, которое может быть получено путем вызова другого метода. Никаких особых усилий для устранения этих исключений не требуется. Просто проверьте возвращаемые значения функций, например.
FILE *fh = fopen("example", "r");
if (fh == NULL) {
fprintf(stderr, "Couldn't open file: %s\n", strerror(errno));
return -1;
}
// do things with fh...
сигналы, с другой стороны, используются в C для обозначения очень необычные ситуации, например, попытка выполнить неверный код или разыменовывать плохой указатель, или другие внешние условия, такие как пользователь, нажав Ctrl + C, чтобы прекратите свою программу. Вы можете попытаться обработать некоторые такие сигналы с помощью функции signal()
, но те, которые вы описали, как плохой указатель, обычно указывают на то, что процесс прикручен довольно устойчиво, поэтому разрешить им прекратить процесс, как правило, правильное решение.
Если вы действительно используете код, подверженный запуску ошибок сегментации, было бы разумным запустить его в отдельном процессе, а не разрешать ему потенциально повреждать состояние среды выполнения Java.
Вы можете обрабатывать ошибки сегментации (сигналы SIGSEGV), но ваша программа находится в плохом месте, как только вы ее получите. – this
Кто говорит, что вы можете обрабатывать исключения в C? Вам просто нужно создать его самостоятельно, вместо того чтобы полагаться на предопределенный код. – ciphermagi
@JonahNelson Зачем вам писать собственный код? Вы когда-нибудь слышали о библиотеках. – this