C/C++

Error handling – Stderr and Exit

 

Ngôn ngữ C có các Standard Files sau: Standard input (stdin), Standard output (stdout) , Standard error (stderr). Bình thường chúng ta chỉ chú ý đến stdin và stdout, thế còn stderr thì sao?

Trong trường hợp xảy ra lỗi, chúng ta sẽ muốn in ra thông báo về lỗi đã gặp phải, đó là lý do chúng ta cần Stderr. Nhưng function printf() cũng in thông báo được mà? Câu trả lời là: Stdout có thể được redirect tới file hoặc trở thành input của một chương trình khác và error message sẽ không được in ra màn hình, trong khi đó Stderr mặc định được in ra màn hình.

Error handling

As such, C programming does not provide direct support for error handling but being a system programming language, it provides you access at lower level in the form of return values. Most of the C or even Unix function calls return -1 or NULL in case of any error and set an error code errno. It is set as a global variable and indicates an error occurred during any function call.

So a C programmer can check the returned values and can take appropriate action depending on the return value. It is a good practice, to set errno to 0 at the time of initializing a program. A value of 0 indicates that there is no error in the program.

The C programming language provides perror() and strerror() functions which can be used to display the text message associated with errno.

  • extern int errno: set by system calls and some library functions in the event of an error to indicate if anything went wrong.
  • perror(const char *s): displays the string s you pass to it, followed by a colon, a space, and then the textual representation of the current errno value.
  • strerror(errno): returns a pointer to the textual representation of the current errno value.

Example 1: Error handling

#include "stdio.h"
#include "errno.h"

extern int errno;
int main() {
   FILE * pf;
   int errnum;
   pf = fopen ("unexist.txt", "rb");

   if (pf == NULL) {
      errnum = errno;
      // print to stderr
      fprintf(stderr, "Value of errno: %d\n", errno);
      perror("Error printed by perror");
      // print to stderr
      fprintf(stderr, "Error opening file: %s\n", strerror(errnum));
   }
   else
      fclose (pf);

   return 0;
}

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


exit() vs. return

  • Function exit() sẽ dừng chương trình ngay lập tức, dù cho exit() được gọi từ trong một function khác.
  • return chỉ dừng chương trình khi được sử dụng ở function main(). Khi được sử dụng trong các function khác, nó trả về giá trị của function.

It is a common practice to exit with a value of EXIT_SUCCESS in case of program coming out after a successful operation. Here, EXIT_SUCCESS is a macro and it is defined as 0.

If you have an error condition in your program and you are coming out then you should exit with a status EXIT_FAILURE which is defined as -1.

Example 2: Program Exit Status

#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);
}

Reference:
[1] The C programming language.
[2] C – Error Handling.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s