কীভাবে ইনফাইলে ফাইলটিতে ত্রুটিগুলি পরিচালনা করতে হবে


20

আমি আমার init ফাইলটি চালানোর সময় ত্রুটিগুলি ধরার একটি উপায় চাই এবং তারপরে সেগুলি করুণভাবে পরিচালনা করব। আমার বেশিরভাগ গুরুত্বপূর্ণ কাস্টমাইজেশন এবং কীবাইন্ডিংগুলি আমার আরম্ভের ফাইলটির শেষে দেখায় যে অন্যান্য সেটিংস তার উপরের অংশে প্রয়োগ হয় না। সমস্যাটি হ'ল সূচনাটি প্রথম দিকে বন্ধ হয়ে গেলে আমার পরিচিত কী বাইন্ডিংগুলি এবং সেটিংস প্রয়োগ না করেই সমস্যাটি ডিবাগ করার চেষ্টা করা সম্পূর্ণ পঙ্গু বোধ করি।

ত্রুটি দেখা দিলে শুরু করার প্রক্রিয়াটি গ্রেফতার করার কোনও উপায় আছে কি?

উত্তর:


9

দুটি বিকল্প, যার মধ্যে কোনওটিই নিখুঁত নয়, তা মাথায় আসে। প্রথমত, আপনি আপনার প্রারম্ভিক প্রাথমিক কোডটি বেশিরভাগ অংশে (যেমন আপনার কাস্টমাইজেশনে পাওয়ার আগে) গুটিয়ে রাখতে পারেন (ignore-errors ...)। সেখানে যদি হয় - ত্রুটি অবশ্য সেখানে প্রতিক্রিয়া অনেকটা হবে না ignore-errorsকেবল ফিরে আসবে nil

আরও জটিল বিকল্পটি হ'ল সম্ভাব্য বগী কোডটি একটি সংমিশ্রণে unwind-protectএবং with-demoted-errors( debug-on-errorনিল সেট সহ ) মোড়ানো । প্রথমটি ত্রুটিযুক্তভাবে ত্রুটিযুক্ত হবে - এটি প্রথম ত্রুটির সাথে দেখা হবে এবং ত্রুটির বার্তাটি *Messages*বাফারে আপনার তদন্তের জন্য জানাবে। এদিকে, unwind-protectশরীরের বাকি অংশগুলি (সম্ভবত আপনার কাস্টমাইজেশনগুলি) মূল্যায়ন করা হবে। সুতরাং, যেমন:

(unwind-protect
    (let ((debug-on-error nil))
      (with-demoted-errors
        (message "The world is about to end")
        (sleep-for 2)
        (/ 10 0)                        ; divide by zero signals an error
        (message "This will never evaluate")
        (sleep-for 2)
        (setq some-var 5)))
  (message "Here are the unwind forms that will always evaluate")
  (sleep-for 2)
  (setq some-var 10)
  (setq another-var "puppies")
  (message "All done!"))

1
ভাল লাগল, আমি না with-demoted-errors। আপনি এটির মতো একটি স্ট্রিং যুক্তি যুক্ত করতে পারেন "LOOK OVER HERE!!! %s", যাতে আপনি বার্তা বাফারে ত্রুটিটি মিস করার সম্ভাবনা কম।
মালবারবা

@ মালবারবা এই ফর্মটি with-demoted-errorsকেবলমাত্র 24.4
লুনারিওর্ন

@ লুনারিওর্ন ধন্যবাদ, এটি জানতেন না।
মালাবারবা

আসলে, আমি যে সংস্করণটি করছি তা 24.3.1।
ড্যান

8

আপনি কীভাবে বার্তাগুলিতে ত্রুটিগুলি পরিবর্তন করতে পারেন তা @ ড্যান ভালভাবে বর্ণনা করেছেন। আপনি ত্রুটিগুলি ব্যবহার করে যা কিছু করতে চান তা ব্যবহার করেও করতে পারেন condition-case। তবুও অন্য বিকল্প ব্যবহার করা হয় unwind-protect

আমি condition-caseকোনও কারণেই এখানে আটকে থাকব না।

ত্রুটি ধরা

এটি ভিতরে কী ঘটেছে তা বিবেচনা না করেই আপনার মূল সংজ্ঞাটি মূল্যায়নের গ্যারান্টিযুক্ত হওয়া উচিত condition-case। কোনও ত্রুটি ভিতরে জমা হয় init-error

(defvar init-error nil 
  "The error which happened.")

(condition-case the-error
    (progn
      ;; Do the dangerous stuff here.
      (require 'what-I-want))
  (error
   ;; This is only evaluated if there's an error.
   (setq init-error the-error)))

;;; Do the safe stuff here.
(define-key uncrippling-map "\C-h" 'help!)

এটি পিছনে নিক্ষেপ

এরপরে, কেবল ত্রুটিটি আবার ফেলে দিন। আপনি এটি করতে পারেন এমন বেশ কয়েকটি উপায় রয়েছে, এখানে একটি।

;;; Throw the error again here.
(when init-error
  (funcall #'signal (car init-error) (cdr init-error)))

unwind-protectআপনি তার উদ্ধার দফায় যে কোনও কোড রেখে যাচ্ছেন তত্ক্ষণাত্ ত্রুটি তত্ক্ষণাত্ পুনরায় উত্থাপিত করে। এটি finallyজাভা এর মতো কোনও ভাষার মতো catch
sanityinc

2

অন্যান্য উত্তরগুলি নিম্ন স্তরের ত্রুটি-পরিচালনার সুবিধাগুলি বেশ ভালভাবে কভার করেছে যা এই জাতীয় ক্ষেত্রে কার্যকর হবে। আরেকটি পদ্ধতি যা সহায়তা করতে পারে তা হল পরিমিতি। উদাহরণস্বরূপ, আমি আমার প্রারম্ভিককরণ ফাইলটি বিভিন্ন 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মোড়ক ছাড়াই প্রয়োজনীয় কিছু বাস্তবায়ন করতে পারেন (সম্ভাব্যভাবে খুব দীর্ঘ) কোড ব্লক।


এই ফাংশনটি ঠিক আমার পরে ছিল। আমার ইমাস বুট এখন একটি ত্রুটি রিপোর্ট করা সত্ত্বেও। এর পরে, আমি কেবল আমার init ফাইলটি লোড করি এবং eval-buffer। এটি পোস্ট করার জন্য ধন্যবাদ।
কেভিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.