C Обработка ошибок

C не обеспечивает прямой поддержки обработки ошибок, но как язык системного программирования он позволяет получать доступ к нижележащим данным в виде возвращаемых значений. При возникновении ошибки большинство вызовов функций C или UNIX возвращают 1 или NULL, и одновременно устанавливается код ошибки.errno, этот код ошибки — глобальная переменная, указывающая, что во время вызова функции произошла ошибка. Различные коды ошибок можно найти в заголовочном файле errno.h.

Следовательно, программисты на C могут проверить возвращаемое значение и затем решить, какие соответствующие действия предпринять на его основе. Разработчикам следует устанавливать errno в 0 во время инициализации программы, что является хорошей практикой программирования. Значение 0 указывает, что в программе нет ошибки.

errno, perror() и strerror()

Язык C предоставляетperror()иstrerror()функции для отображенияerrnoсвязанные текстовые сообщения.

  • perror()Функция отображает строку, которую вы ей передаёте, за которой следуют двоеточие, пробел и текстовое представление текущего значения errno.
  • strerror()Функция возвращает указатель, который указывает на текстовое представление текущего значения errno.

Давайте смоделируем состояние ошибки, попытавшись открыть файл, которого не существует. Вы можете использовать различные способы вывода сообщений об ошибках; здесь мы используем функции для демонстрации использования. Также следует отметить, что вы должны использоватьstderrфайловые потоки для вывода всех ошибок.

Пример

#include <stdio.h> #include <errno.h> #include <string.h> extern int errno ; int main () { FILE * pf; int errnum; pf = fopen ("unexist.txt", "rb"); if (pf == NULL) { errnum = errno; fprintf(stderr, "Номер ошибки: %d\n", errno); perror("Вывод ошибки через perror"); fprintf(stderr, "Ошибка открытия файла: %s\n", strerror( errnum )); } else { fclose (pf); } return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

错误号: 2
通过 perror 输出错误: No such file or directory
打开文件错误: No such file or directory

Ошибки деления на ноль

При выполнении деления, если не проверять, равен ли делитель нулю, это приведёт к ошибке времени выполнения.

Чтобы избежать этой ситуации, следующий код проверяет, равен ли делитель нулю, перед выполнением операции деления:

Пример

#include <stdio.h> #include <stdlib.h> int main() { int dividend = 20; int divisor = 0; int quotient; if( divisor == 0){ fprintf(stderr, "Деление на ноль, выход...\n"); exit(-1); } quotient = dividend / divisor; fprintf(stderr, "Значение переменной quotient: %d\n", quotient ); exit(0); }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

除数为 0 退出运行...

Статус завершения программы

В общем случае, когда программа успешно выполняет операцию и завершается нормально, она возвращает значение EXIT_SUCCESS. Здесь EXIT_SUCCESS — это макрос, определённый как 0.

Если в программе возникает ошибка, при завершении программы она возвращает значение статуса EXIT_FAILURE, которое определено как -1. Таким образом, приведённую выше программу можно записать так:

Пример

#include <stdio.h> #include <stdlib.h> int main() { int dividend = 20; int divisor = 5; int quotient; if( divisor == 0){ fprintf(stderr, "Деление на ноль, выход...\n"); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr, "Значение переменной quotient: %d\n", quotient ); exit(EXIT_SUCCESS); }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

quotient 变量的值为 : 4
Другие расширения