C
không chính thức cung cấp một cú pháp nào hỗ trợ xử lý các logic ngoại lệ, mà thay vào đó chúng ta sẽ có một vài sub-program
hỗ trợ biểu thị lỗi ở cấp độ tương tác với hệ điều hành. Hầu hết các ứng dụng C
đều sử dụng giá trị -1
hoặc NULL
để trả về ở các sub-program
có khả năng phát sinh logic vận hành ngoại lệ và thiết lập một mã error code
. Sau đó code xử lý logic tiếp theo của chương trình sẽ kiểm tra khả năng xuất hiện của các giá trị này để ra quyết định xử lý ngoại lệ.
errno.h
Các mã error code
và chương trình biên dịch các mã này thành các tin nhắn có thể được tìm thấy trong errno.h
của thư viện tiêu chuẩn mà chúng ta đã nhắc tới trước đó. Tuy nhiên thông thường thì chúng ta sẽ không sử dụng các mã này làm kết quả trả về của các sub-program
mà thiết lập và truy xuất thông qua biến ngoại vi errno
đã được định nghĩa sẵn. Để sử dụng một biến ngoại vi ở lớp toàn cục global
đã được định nghĩa sẵn, chúng ta khai báo tên biến với từ khóa extern
đặt trước tên định kiểu.
# include <stdio.h>
# include <errno.h>
# include <string.h> extern int errno; void main () { FILE* file; file = fopen ("data.txt", "rb"); if (file == NULL) { fprintf (stderr, "Value of errno: %d \n", errno); fprintf (stderr, "Error opening file: %s \n", strerror (errno)); } else { fprintf ("Successfully opened file. \n"); fclose (file); }
} // main
Value of errno: 2
Error opening file: No such file or directory
Chương trình strerror
ở đây được định nghĩa để chuyển đổi mã errno
thành dạng văn bản khi cần thiết. Tuy nhiên, đối với các kiểu ngoại lệ khác mang ý nghĩa với bối cảnh của phần mềm đang xây dựng thì chúng ta sẽ không sử dụng cả hai công cụ này.
enum
Dạng thức định nghĩa tập các giá trị hằng và một sub-program
biên dịch ý nghĩa để biểu thị các trạng thái khác nhau của một phần ứng dụng như các thông báo lỗi ở trên có thể được triển khai bằng các chỉ dẫn #define
. Tuy nhiên, C
có cung cấp sẵn một cú pháp để định nghĩa tập giá trị liên quan được gọi là enum
.
# include <stdio.h> typedef enum { RED, GREEN, BLUE
} color_t; void main () { fprintf (stdout, "RED : %i \n", RED); fprintf (stdout, "GREEN : %i \n", GREEN); fprintf (stdout, "BLUE : %i \n", BLUE);
}
RED : 0
GREEN : 1
BLUE : 2
Như vậy chúng ta sẽ có thể tạo dựng một cơ chế phát động ngoại lệ là khi nhận được NULL
hoặc -1
, thì code sẽ gọi tới sub-program
để ghi chuỗi mô tả thông báo lỗi tới kênh stderr
bằng trình in fprintf
như ví dụ ở phần trước đó. Các thông tin thường được in kèm theo thông báo ngoại lệ là đường dẫn tới tệp code đang thực thi __FILE__
, số thứ tự của dòng code __LINE__
kiểm tra thấy NULL
.