Учебники

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

Таким образом, программирование на C не обеспечивает прямой поддержки обработки ошибок, но, будучи языком системного программирования, оно предоставляет вам доступ на более низком уровне в форме возвращаемых значений. Большинство вызовов функций C или даже Unix возвращают -1 или NULL в случае любой ошибки и устанавливают код ошибки errno . Он устанавливается как глобальная переменная и указывает на ошибку, возникшую во время любого вызова функции. Вы можете найти различные коды ошибок, определенные в заголовочном файле <error.h>.

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

ошибка, perror (). и strerror ()

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

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

  • Функция 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, "Value of errno: %d\n", errno);
      perror("Error printed by perror");
      fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
   } else {
   
      fclose (pf);
   }
   
   return 0;
}

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

Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory

Разделить на ноль ошибок

Общей проблемой является то, что во время деления любого числа программисты не проверяют, равен ли делитель нулю, и, наконец, он создает ошибку времени выполнения.

Код ниже исправляет это, проверяя, равен ли делитель нулю перед делением —

Live Demo

#include <stdio.h>
#include <stdlib.h>

main() {

   int dividend = 20;
   int divisor = 0;
   int quotient;
 
   if( divisor == 0){
      fprintf(stderr, "Division by zero! Exiting...\n");
      exit(-1);
   }
   
   quotient = dividend / divisor;
   fprintf(stderr, "Value of quotient : %d\n", quotient );

   exit(0);
}

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

Division by zero! Exiting...

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

Обычной практикой является выход со значением EXIT_SUCCESS в случае выхода программы после успешной операции. Здесь EXIT_SUCCESS является макросом, и он определен как 0.

Если в вашей программе возникла ошибка, и вы выходите из нее, вам следует выйти со статусом EXIT_FAILURE, который определен как -1. Итак, давайте напишем выше программу следующим образом —

Live Demo

#include <stdio.h>
#include <stdlib.h>

main() {

   int dividend = 20;
   int divisor = 5;
   int quotient;
 
   if( divisor == 0) {
      fprintf(stderr, "Division by zero! Exiting...\n");
      exit(EXIT_FAILURE);
   }
	
   quotient = dividend / divisor;
   fprintf(stderr, "Value of quotient : %d\n", quotient );

   exit(EXIT_SUCCESS);
}

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