Sử dụng exit()
là OK
Hai khía cạnh chính của thiết kế mã vẫn chưa được đề cập là 'phân luồng' và 'thư viện'.
Trong một chương trình đơn luồng, trong mã bạn đang viết để triển khai chương trình đó, việc sử dụng exit()
là tốt. Các chương trình của tôi sử dụng nó thường xuyên khi có sự cố và mã sẽ không khôi phục.
Nhưng…
Tuy nhiên, kêu gọi exit()
là một hành động đơn phương không thể hoàn tác. Đó là lý do tại sao cả 'luồng' và 'thư viện' đều cần phải suy nghĩ cẩn thận.
Chương trình phân luồng
Nếu một chương trình là đa luồng, thì việc sử dụng exit()
là một hành động kịch tính sẽ kết thúc tất cả các luồng. Nó có thể sẽ không thích hợp để thoát toàn bộ chương trình. Có thể thích hợp để thoát khỏi chuỗi, báo cáo lỗi. Nếu bạn nhận thức được thiết kế của chương trình, thì có thể cho phép thoát đơn phương đó, nhưng nói chung, nó sẽ không được chấp nhận.
Mã thư viện
Và mệnh đề 'nhận thức về thiết kế của chương trình' cũng áp dụng cho mã trong thư viện. Việc gọi một hàm thư viện mục đích chung là rất hiếm khi đúng exit()
. Bạn sẽ rất khó chịu nếu một trong các hàm thư viện C chuẩn không trả lại được chỉ vì lỗi. (Rõ ràng, các chức năng như exit()
, _Exit()
, quick_exit()
, abort()
nhằm mục đích không để trở lại, đó là khác nhau.) Các chức năng trong thư viện C do đó một trong hai "không thể thất bại" hoặc trả lại một dấu hiệu lỗi bằng cách nào đó. Nếu bạn đang viết mã để đi vào thư viện mục đích chung, bạn cần xem xét chiến lược xử lý lỗi cho mã của mình một cách cẩn thận. Nó phải phù hợp với các chiến lược xử lý lỗi của chương trình mà nó được dự định sử dụng, hoặc việc xử lý lỗi có thể được cấu hình.
Tôi có một loạt các hàm thư viện (trong một gói có tiêu đề "stderr.h"
, một tên nằm trên lớp băng mỏng) nhằm thoát ra khi chúng được sử dụng để báo lỗi. Các chức năng đó thoát ra theo thiết kế. Có một loạt hàm liên quan trong cùng một gói báo lỗi và không thoát. Tất nhiên, các chức năng thoát được thực hiện theo các chức năng không thoát, nhưng đó là chi tiết triển khai nội bộ.
Tôi có nhiều chức năng thư viện khác và rất nhiều chức năng trong số họ dựa vào "stderr.h"
mã để báo lỗi. Đó là một quyết định thiết kế mà tôi đã đưa ra và là một quyết định mà tôi đồng ý. Nhưng khi các lỗi được báo cáo với các chức năng thoát ra, nó hạn chế tính hữu ích chung của mã thư viện. Nếu mã gọi các hàm báo lỗi không thoát, thì các đường dẫn mã chính trong hàm phải xử lý lỗi trả về một cách lành mạnh - phát hiện chúng và chuyển tiếp chỉ báo lỗi đến mã gọi.
Mã cho gói báo cáo lỗi của tôi có sẵn trong kho lưu trữ SOQ (Câu hỏi dồn về ngăn xếp) trên GitHub dưới dạng tệp stderr.c
và stderr.h
trong thư mục con src / libsoq .