Các câu trả lời khác đã bao phủ khá tốt các phương tiện xử lý lỗi cấp thấp sẽ hữu ích trong trường hợp như thế này. Một cách tiếp cận khác có thể giúp đỡ là mô-đun. Chẳng hạn, tôi chia tệp khởi tạo của mình thành nhiều tệp khác nhau (sử dụng provide
khi thích hợp) và tôi tải chúng bằng chức năng này thay vì require
:
(defun my/require-softly (feature &optional filename)
"As `require', but instead of an error just print a message.
If there is an error, its message will be included in the message
printed.
Like `require', the return value will be FEATURE if the load was
successful (or unnecessary) and nil if not."
(condition-case err
(require feature filename)
(error (message "Error loading %s: \"%s\""
(if filename (format "%s (%s)" feature filename) feature)
(error-message-string err))
nil)))
Một lỗi trong khi tải tệp theo cách này vẫn sẽ in một thông báo, nhưng nó sẽ không ngăn thực thi bất cứ điều gì bên ngoài tệp nơi xảy ra lỗi.
Tất nhiên, chức năng này không thực sự khác với việc thực hiện require
cuộc gọi with-demoted-errors
(tôi đã viết nó trước khi tôi biết with-demoted-errors
), nhưng điểm quan trọng là về cơ bản bạn có thể thực hiện một cái gì đó như kết hợp with-demoted-errors
và unwind-protect
không kết thúc của Dan (có khả năng rất dài) khối mã.
with-demoted-errors
. Bạn có thể thêm một đối số chuỗi cho nó như thế"LOOK OVER HERE!!! %s"
, vì vậy bạn sẽ ít có khả năng bỏ sót lỗi trong bộ đệm thư.