คำถามติดแท็ก error-handling

3
วิธีจัดการข้อผิดพลาดอย่างนุ่มนวลในไฟล์ init
ฉันต้องการวิธีที่จะตรวจจับข้อผิดพลาดเมื่อเรียกใช้ไฟล์ init ของฉันจากนั้นจัดการกับข้อผิดพลาดเหล่านั้นอย่างสง่างาม การปรับแต่งและการผูกกุญแจที่สำคัญที่สุดของฉันปรากฏขึ้นที่ส่วนท้ายของไฟล์ init ของฉันเพื่อให้แน่ใจว่าการตั้งค่าอื่น ๆ จะไม่ถูกนำไปใช้ที่ด้านบนของพวกเขา ปัญหาคือเมื่อการเริ่มต้นยกเลิกต้นเร็ว ๆ นี้ฉันรู้สึกว่าคนพิการทั้งหมดพยายามแก้ไขข้อบกพร่องโดยไม่ต้องใช้การเชื่อมโยงคีย์และการตั้งค่าที่คุ้นเคย มีวิธีใดที่จะทำให้กระบวนการเริ่มต้นเสร็จสิ้นอย่างสง่างามเมื่อเกิดข้อผิดพลาดหรือไม่?

3
แสดงหมายเลขบรรทัดบนข้อผิดพลาด
สมมติว่า emacs พ่นข้อผิดพลาดบางอย่างที่ฉันไม่เข้าใจ หรืออาจเกิดข้อผิดพลาดว่า "ค่าของ Symbol ในฐานะตัวแปรเป็นโมฆะ: โหมด" แต่มีสัญลักษณ์modesในรหัสของฉันเกิดขึ้นมากมายดังนั้นฉันต้องการบริบทบางอย่าง Emacs สามารถกำหนดค่าให้พูดถึงหมายเลขบรรทัดของเสียงกระเพื่อมเพื่อให้ฉันสามารถรู้รหัสที่ทำให้เกิดข้อผิดพลาดหรือไม่ ฉันได้ลองทำ(setq stack-trace-on-error '(buffer-read-only))และเรียกใช้รหัสที่ทำให้ล้มเหลวในความพยายามที่จะได้รับการติดตามสแต็ก ไม่มีการติดตามสแต็กอย่างใดอย่างหนึ่ง ฉันได้ลองโทรหาedebug-defunฟังก์ชั่นของฉันแล้วลองดู มันไม่ได้จนกว่าฉันจะก้าวออกจากฟังก์ชั่นที่เกิดข้อผิดพลาด (ฉันไม่สนใจสาเหตุของข้อผิดพลาดเฉพาะที่ฉันเผชิญอยู่ในขณะนี้เนื่องจากฉันกำลังพัฒนาทักษะการดีบักทั่วไปสำหรับ elisp โปรดแนะนำเกี่ยวกับวิธีที่ฉันสามารถเปล่งประกายหมายเลขบรรทัดหรือ sexp หรือการติดตามสแต็กจาก ข้อผิดพลาด.)

1
รับ backtrace จากข้อผิดพลาดทางโปรแกรม
หากมีข้อผิดพลาดจะส่งสัญญาณในรหัส Emacs Lisp และdebug-on-errorคือtฉันได้รับบัฟเฟอร์ backtrace ที่ทำให้ง่ายต่อการคิดออกที่เกิดข้อผิดพลาด อย่างไรก็ตามสำหรับข้อผิดพลาดที่เกิดขึ้นขณะประมวลผลการตอบสนองจากเครือข่ายแบบอะซิงโครนัสมันจะน่ารำคาญถ้ามีบัฟเฟอร์ backtrace ปรากฏขึ้นดังนั้นฉันอยากจะจับข้อผิดพลาดด้วยcondition-caseและเข้าสู่ระบบ ดังนั้นเมื่อฉันจัดการข้อผิดพลาดcondition-caseมีวิธีเข้าถึง backtrace ที่จุดของข้อผิดพลาดหรือไม่? การเรียกใช้backtraceฟังก์ชันรับ backtrace ของโค้ดภายในตัวจัดการซึ่งไม่ใช่สิ่งที่ฉันกำลังมองหา (condition-case e (do-something-that-might-fail) (error (message "%s" ;; This gets the wrong backtrace! (with-temp-buffer (let ((standard-output (current-buffer))) (backtrace) (buffer-string))))))

2
Rethrowing ข้อผิดพลาดใน Emacs Lisp
ฉันจำเป็นต้องเรียกใช้ฟังก์ชันและดำเนินการล้างเท่านั้นถ้าฟังก์ชันล้มเหลวแล้วสังข์ข้อผิดพลาด นี่คือรหัสเทียม: (condition-case err (call-function) (error (cleanup) ;; how do I raise `err`? ))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.