Xử lý lỗi trong C




Các ngôn ngữ lập trình như ngôn ngữ C không cung cấp trực tiếp hỗ trợ việc xử lý lỗi nhưng bởi vì là ngôn ngữ chương trình hệ thống, nó cung cấp mức thấp nhất các dạng của giá trị trả về. Hầu hết các hàm của C và hàm trong Unix trả về giá trị 1 hoặc null trong bất kỳ trường hợp lỗi nào và thiết lập một mã lỗi errno cho biến toàn cục và chỉ dẫn có lỗi xảy ra trong quá trình gọi hàm. Bạn có thể tìm thấy nhiều mã lỗi khác nhau trong Header file có tên là <error.h>.

Vì thế một lập trình viên C có thể kiểm tra giá trị trả về và thực hiện hành động chính xác dựa vào giá trị trả về. Trong thực tế, lập trình viên nên thiết lập giá trị errno là 0 tại thời điểm khởi tạo chương trình. Một giá trị 0 thể hiện rằng không có lỗi trong chương trình.

Hàm perror() và strerror() và thông báo lỗi errno trong C

Ngôn ngữ chương trình C cung cấp các hàm perror()strerror() có thể được sử dụng để hiển thị thông báo lỗi errno.

  • Hàm perror() hiển thị chuỗi mà bạn truyền cho nó, theo sau bởi dấu hai chấm, một khoẳng trắng và sau đó là đoạn văn bản mô tả giá trị lỗi hiện tại.

  • Hàm strerror() trả về con trỏ đến đoạn văn bản biểu diễn giá trị lỗi.

Cùng thử mô phỏng một điều kiện lỗi và thử mở một file không tồn tại. Tại đây tôi sử dụng cả hai hàm để chỉ ra cách sử dụng, nhưng bạn có thể sử dụng một hoặc nhiều cách để in ra giá trị lỗi của bạn. Điểm quan trọng thứ 2 cần ghi nhớ là bạn nên sử dụng stderr để đưa ra tất cả các lỗi.

#include <stdio.h>
#include <errno.h> /* header file de su dung cac ham va hang can thiet*/
#include <string.h>

extern int errno ;

int main ()
{
   FILE * pf;
   int errnum;
   pf = fopen ("unexist.txt", "rb");
   if (pf == NULL)
   {
      errnum = errno;
      fprintf(stderr, "Gia tri cua errno la: %d\n", errno);
      perror("Error duoc in boi ham perror");
      fprintf(stderr, "Loi xuat hien khi mo file: %s\n", strerror( errnum ));
   }
   else
   {
      fclose (pf);
   }
   
   printf("\n===========================\n");
   printf("VietJack chuc cac ban hoc tot! \n");
   return 0;
}
Loading...

Biên dịch và thực thi chương trình C trên sẽ cho kết quả sau:

Xử lý lỗi trong C

Lỗi chia cho số 0 trong C

Đây là một trong những lỗi rất phổ biến trong quá trình chia, bất cứ lập trình viên nào không kiểm tra điều kiện số bị chia là số 0 có thể gặp lỗi này trong quá trình thực hiện.

Đoạn code bên dưới sửa lỗi này bởi việc kiểm tra điều kiện nếu số bị chia là số 0 trước khi chia:

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

main()
{
   int sochia = 15;
   int sobichia = 0;
   int thuong;
 
   if( sobichia == 0){
      fprintf(stderr, "Ban dang thuc hien phep chia cho so 0!!! Ket thuc chuong trinh ...\n");
      exit(-1);
   }
   thuong = sochia / sobichia;
   fprintf(stderr, "Gia tri cua thuong la : %d\n", thuong );
   
   printf("\n===========================\n");
   printf("VietJack chuc cac ban hoc tot! \n");

   exit(0);
}

Biên dịch và thực thi chương trình C trên sẽ cho kết quả sau:

Lỗi chia cho số 0 trong C

Trạng thái thoát chương trình trong C

Trong thực tế để thoát chương trình với giá trị EXIT_SUCCESS trong trường hợp chương trình thoát ra sau khi một hoạt động thành công. Ở đây EXIT_SUCCESS là một macro được định nghĩa là giá trị 0.

Nếu bạn có điều kiện lỗi trong chương trình của bạn, bạn nên thoát ra với một trạng thái trả về là EXIT_FAILURE được định nghĩa có giá trị là -1. Bây giờ viết chương trình trên như sau:

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

main()
{
   int sochia = 36;
   int sobichia = 6;
   int thuong;
 
   if( sobichia == 0){
      fprintf(stderr, "Ban dang thuc hien phep chia cho so 0!!! Ket thuc chuong trinh ...\n");
      exit(EXIT_FAILURE);
   }
   thuong = sochia / sobichia;
   fprintf(stderr, "Gia tri cua thuong la: %d\n", thuong );
   
   printf("\n===========================\n");
   printf("VietJack chuc cac ban hoc tot! \n");

   exit(EXIT_SUCCESS);
}

Biên dịch và thực thi chương trình C trên sẽ cho kết quả sau:

Xử lý lỗi trong C
Loading...

Loạt bài hướng dẫn học lập trình C cơ bản và nâng cao của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint.com

Follow https://www.facebook.com/vietjackteam/ để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.

Các bài học lập trình C phổ biến khác tại VietJack: