คำตอบอื่น ๆ ได้ครอบคลุมสิ่งอำนวยความสะดวกในการจัดการข้อผิดพลาดระดับต่ำที่จะเป็นประโยชน์ในกรณีเช่นนี้ วิธีการอื่นที่สามารถช่วยได้ก็คือแบบแยกส่วน ตัวอย่างเช่นฉันแบ่งไฟล์เริ่มต้นของฉันออกเป็นหลาย ๆ ไฟล์ (ใช้provide
ตามความเหมาะสม) และฉันโหลดไฟล์โดยใช้ฟังก์ชั่นนี้แทน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)))
ข้อผิดพลาดขณะโหลดไฟล์ด้วยวิธีนี้จะยังคงพิมพ์ข้อความ แต่จะไม่ป้องกันการดำเนินการใด ๆ นอกไฟล์ที่เกิดข้อผิดพลาดจริง
แน่นอนว่าฟังก์ชั่นนี้ไม่ได้แตกต่างจากการวางrequire
สายwith-demoted-errors
(ฉันเขียนก่อนที่ฉันจะรู้with-demoted-errors
) แต่ประเด็นสำคัญก็คือคุณสามารถนำบางสิ่งอย่างเช่นการรวมกันของแดนเข้าด้วยกันwith-demoted-errors
และunwind-protect
ไม่ห่อหุ้ม (อาจยาวมาก) บล็อกของรหัส
with-demoted-errors
ดีฉันไม่ได้เกี่ยวกับ คุณสามารถเพิ่มอากิวเมนต์ของสตริงได้"LOOK OVER HERE!!! %s"
ดังนั้นคุณมีโอกาสน้อยที่จะพลาดข้อผิดพลาดในบัฟเฟอร์ข้อความ