প্রোগ্রামগতভাবে ত্রুটি থেকে ব্যাকট্র্যাস পান


12

যদি ইমাস লিস্প কোডে কোনও ত্রুটি সংকেত দেওয়া থাকে এবং debug-on-errorহয় তবে tআমি একটি ব্যাকট্র্যাস বাফার পেয়েছি যা ত্রুটিটি কোথায় ঘটেছে তা নির্ধারণ করা সহজ করে তোলে। তবে, ত্রুটিগুলির জন্য যা সংকেত হিসাবে নেটওয়ার্ক থেকে প্রতিক্রিয়া প্রক্রিয়া করার সময় ঘটে থাকে, ব্যাকট্র্যাস বাফার পপ আপ করা বিরক্তিকর হবে, তাই আমি ত্রুটিটি ধরা দিয়ে condition-caseএটি লগ করব।

সুতরাং আমি যখন কোনও ত্রুটিটি পরিচালনা করছি তখন ত্রুটির condition-caseপর্যায়ে ব্যাকট্রেজে অ্যাক্সেস পাওয়ার কোনও উপায় আছে কি? 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))))))

1
আমার magithub-errorফাংশনটি আমার মনে হয় এর মতো কিছু করে তবে আমি এখনই কম্পিউটারে নেই। এটি নির্বিশেষে সাহায্য করতে পারে।
শন অলরেড

1
এটি কোনও ভাষার ক্ষেত্রে একটি সাধারণ সমস্যা যা এর স্ট্যাকটিকে একইভাবে পরিচালনা করে। এটি পরিচালনা করার একটি উপায় হ'ল কোনও ত্রুটি সিগন্যাল করা যা এর সাথে ইতিমধ্যে স্ট্যাকের তথ্য সংযুক্ত রয়েছে। অর্থাত্ আপনার ক্ষেত্রে, আপনি do-something-that-might-failস্ট্যাক-ট্রেস তৈরি করতে এবং এটির ত্রুটির সাথে সংযুক্ত করে ফেলবেন attach
wvxvw

1
debbugs.gnu.org/cgi/bugreport.cgi?bug=24617#8 এর একটি পরামর্শ আছে (নিজে চেষ্টা করে
দেখেননি

উত্তর:


1

সবচেয়ে সহজ কাজটি হল যে পরিবেশে ত্রুটি দেখা দেয় সেখানে নিজের ডিবাগার তৈরি করা। এটি এর মত কিছু যায়:

(defun my-debugger (&rest debugger-args)
  (message "BACKTRACE: %s"
           (with-temp-buffer
             (let ((standard-output (current-buffer)))
               (backtrace)
               (buffer-string)))))

(let ((debugger #'my-debugger))
  (foobar)) ; Runs a function with no definition!

letপরিবেশ এই কাস্টম ডিবাগার ফাংশন ব্যবহার my-debuggerএটা ভিতরে কোড চলাকালীন, তাই আপনি যদি একটি অ-ঘাঁটা ত্রুটির সম্মুখীন, "ডিবাগার" চালানো হবে, যা মূলত শুধু বার্তা আউট ছাপে। এই ডিবাগারটি এমন পরিবেশে চলে যেখানে ত্রুটি ঘটেছে, তাই আপনার ব্যাকট্রিজ আপনাকে কী ঘটেছে তা বলবে।

দ্রষ্টব্য: এই কোডটিতে দুটি (সমাধানযোগ্য) সমস্যা রয়েছে যা আমি আপনার জন্য ছেড়ে দেব। প্রথমত, আপনি সম্ভবত প্রথম কয়েকটি স্ট্যাক ফ্রেমগুলি ছাঁটাই করতে চান, কারণ তারা অনুরোধের সাথে সম্পর্কিত backtrace। দ্বিতীয়ত, আপনি একটি বার্তা পাবেন যা ত্রুটিটিও নির্দেশ করে (উদাহরণস্বরূপ, উপরের ক্ষেত্রে, "যাক: প্রতীকটির ফাংশন সংজ্ঞাটি বাতিল, ফুবার")। উভয়ই বিশাল সমস্যা নয়, তবে আমি আমার প্রতিক্রিয়া জঞ্জাল করতে চাইনি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.