Emacs Lisp में एक त्रुटि रीथ्रोइंग


9

मुझे फ़ंक्शन को कॉल करने और फ़ंक्शन विफल होने पर केवल क्लीनअप करने की आवश्यकता है , और फिर त्रुटि को फिर से दर्ज करें। यहाँ छद्म कोड है:

(condition-case err
    (call-function)
  (error
   (cleanup)
   ;; how do I raise `err`?
   ))

जवाबों:


10

BTW, एक वैकल्पिक विकल्प कुछ इस तरह हो सकता है:

(let ((error t))
  (unwind-protect
      (prog1 (call-function)
        (setq error nil))
    (when error (cleanup))))

लाभ यह है कि आप त्रुटि को पकड़ने और फिर से उखाड़ने से बचते हैं, जिसका अर्थ है कि डिबगर आपको सही बैक्रेस दिखाएगा (वह जो त्रुटि के वास्तविक स्रोत से मेल खाती है, बजाय इसके कि आप किसी और की त्रुटि को फिर से फेंक दें। )।

एक और अंतर यह है कि cleanupन केवल त्रुटि पर बुलाया जाएगा, बल्कि यह भी कि कोड एक C-gया कॉल करने के लिए बाधित है throw


1
धन्यवाद। क्यों नहीं condition-caseपकड़ेगा keyboard-quit?
ऐलेना

3
क्योंकि यह कोई त्रुटि नहीं है (अर्थात इसका संकेत, अपने माता-पिता के बीच quitनहीं है error)। IOW यू वैन इसे भी पकड़ लेती है condition-caseलेकिन इसके लिए आपको quitसाथ रखना होगा error। बेशक, कि अभी भी 'फेंक' मामले को संभाल नहीं होगा।
स्टीफन

13

आप देख रहे हैं signal:

(condition-case err
    (call-function)
  (error
   (cleanup)
   (signal (car err) (cdr err)))) ; reraise `err'

मैंने विचार किया था signal, लेकिन इसका प्रोटोटाइप है (signal ERROR-SYMBOL DATA), नहीं (signal ERROR)
ऐलेना

@ एलीना: सही क्षमा करें, आपने इसे carऔर साथ खींच लिया है cdr। उत्तर अपडेट किया गया।
15:44 बजे npostavs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.