- vừa được xem lúc

[Imperative Programming + C] Bài 15 - Error Handling

0 0 9

Người đăng: Semi Dev

Theo Viblo Asia

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Closure trong Javascript - Phần 2: Định nghĩa và cách dùng

Các bạn có thể đọc qua phần 1 ở đây. Để mọi người không quên, mình xin tóm tắt gọn lại khái niệm lexical environment:.

0 0 51

- vừa được xem lúc

Var vs let vs const? Các cách khai báo biến và hằng trong Javascript

Dạo này mình tập tành học Javascript, thấy có 2 cách khai báo biến khác nhau nên đã tìm tòi sự khác biệt. Nay xin đăng lên đây để mọi người đọc xong hy vọng phân biệt được giữa let và var, và sau đó là khai báo hằng bằng const.

0 0 31

- vừa được xem lúc

VueJS: Tính năng Mixins

Chào mọi người, hôm nay mình sẽ viết về Mixins và 1 số vấn đề trong sử dụng Mixins hay ho mà mình gặp trong dự án thực. Trích dẫn từ trang chủ của VueJS:.

0 0 27

- vừa được xem lúc

Asset Pipeline là cái chi chi?

Asset Pipeline. Asset pipeline là cái chi chi. . Giải thích:.

0 0 47

- vừa được xem lúc

Tạo data table web app lấy dữ liệu từ Google Sheets sử dụng Apps Script

Google Sheets là công cụ tuyệt vời để lưu trữ bảng tính trực tuyến, bạn có thể truy cập bảng tính bất kỳ lúc nào ở bất kỳ đâu và luôn sẵn sàng để chia sẻ với người khác. Bài này gồm 2 phần.

0 0 266

- vừa được xem lúc

Học Deep Learning trên Coursera miễn phí

Bạn muốn bắt đầu với Deep Learning nhưng không biết bắt đầu từ đâu? Bạn muốn có một công việc ở mức fresher về Deep Learning? Bạn muốn khoe bạn bè về kiến thức Deep Learning của mình. Bắt đầu từ đâu.

0 0 35