ইমাস লিস্পে ত্রুটি বাড়ানো


9

আমাকে একটি ফাংশন কল করতে হবে এবং ফাংশনটি ব্যর্থ হলে কেবল একটি ক্লিনআপ করা উচিত এবং তারপরে ত্রুটিটি পুনরায় চালু করতে হবে। এখানে সিউডো কোডটি রয়েছে:

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

উত্তর:


10

বিটিডাব্লু, একটি বিকল্প বিকল্প এর মতো হতে পারে:

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