ব্যতিক্রমগুলি ত্রুটির সাধারণীকরণ হিসাবে বিকশিত হয়েছিল। একটি ব্যতিক্রম প্রক্রিয়া অন্তর্ভুক্ত করা প্রথম প্রোগ্রামিং ভাষা 1970 এর দশকে পাতার মর্মর ছিল। গ্যাব্রিয়েল এবং স্টিলের ভাষা বিবর্তনের প্যাটার্নটিতে একটি ভাল সংক্ষিপ্তসার রয়েছে। ব্যতিক্রমগুলি (যাদের এখনও ব্যতিক্রম বলা হয়নি) কোনও ত্রুটি দেখা দিলে কোনও প্রোগ্রামের আচরণ নির্দিষ্ট করার প্রয়োজন থেকে উদ্ভূত হয়েছিল। একটি সম্ভাবনা হ'ল প্রোগ্রামটি থামানো, তবে এটি সর্বদা সহায়ক নয়। লিস্প প্রয়োগগুলি traditionতিহ্যগতভাবে একটি ত্রুটিতে ডিবাগারে প্রবেশের একটি উপায় ছিল, তবে কখনও কখনও প্রোগ্রামাররা তাদের প্রোগ্রামে ত্রুটি পরিচালনার অন্তর্ভুক্ত করতে চেয়েছিল। সুতরাং 1960 এর দশকের লিস্প বাস্তবায়নের বলার একটি উপায় ছিল "এটি করুন, এবং যদি কোনও ত্রুটি দেখা দেয় তবে পরিবর্তে তা করুন"। মূলত ত্রুটিগুলি আদিম ফাংশন থেকে এসেছিল তবে প্রোগ্রামাররা প্রোগ্রামটির কিছু অংশ এড়াতে এবং ত্রুটি হ্যান্ডলারের দিকে ঝাঁপিয়ে যাওয়ার জন্য ইচ্ছাকৃতভাবে ত্রুটিটি ট্রিগার করা সুবিধাজনক বলে মনে করেছিল।
1972 সালে, লিস্পে ব্যতিক্রম হ্যান্ডলিংয়ের আধুনিক রূপটি ম্যাকলিস্পে হাজির হয়েছিল: throw
এবং catch
। সফটওয়্যার সংরক্ষণ গ্রুপের সহ গোড়ার দিকে পাতার মর্মর বাস্তবায়নের উপর উপাদান অনেক তালিকাবদ্ধ করে ডেভিড চন্দ্র দ্বারা MACLISP রেফারেন্স ম্যানুয়াল পরিবর্ধন ও পরিবর্তন 0 । প্রিমিটিভের catch
এবং throw
§5.3 p.43 মধ্যে নথিভুক্ত করা হয়।
catch
কাঠামোগত অ-স্থানীয় প্রস্থান করার জন্য LISP ফাংশন। (catch x)
মূল্যায়ন x
এবং এর মানগুলি প্রদান করে, ব্যতীত যদি মূল্যায়নের সময় মূল্যায়ন করা x
(throw y)
উচিত, catch
তাত্ক্ষণিকভাবে y
আরও মূল্যায়ন না করে ফিরে আসে x
।
catch
কোনও ইকন্ড আর্গুমেন্টের সাথেও ব্যবহার করা যেতে পারে, মূল্যায়ন করা হয়নি, যা নেস্টেড ক্যাচগুলির মধ্যে পার্থক্য করার জন্য ট্যাগ হিসাবে ব্যবহৃত হয়। (...)
throw
catch
একটি কাঠামোগত ননলোকাল প্রস্থান ব্যবস্থার হিসাবে ব্যবহার করা হয় ।
(throw x)
মূল্যায়ন করে x
এবং মানটিকে সাম্প্রতিকতমটিতে ফেলে দেয় catch
।
(throw x <tag>)
x
সবচেয়ে সাম্প্রতিক catch
লেবেলযুক্ত <tag>
বা লেবেলবিহীন লেবেলে ফিরে ফিরে মান rows
ফোকাস ননলোকাল নিয়ন্ত্রণ প্রবাহের উপর। এটা তোলে (একটি উর্ধ্বগামী শুধুমাত্র এতে যান) এতে যান একটি ফর্ম, যা একটি বলা হয় লাফ । রূপকটি হ'ল প্রোগ্রামটির একটি অংশ ব্যতিক্রম হ্যান্ডলারের কাছে ফিরে যেতে মান নিক্ষেপ করে এবং ব্যতিক্রম হ্যান্ডলার সেই মানটি ধরে এবং এটি ফেরত দেয়।
বেশিরভাগ প্রোগ্রামিং ভাষা আজ একটি ব্যতিক্রম বস্তুতে ট্যাগ এবং মানটি প্যাক করে এবং একটি হ্যান্ডলিং প্রক্রিয়াটির সাথে ধরা পদ্ধতিটিকে একত্রিত করে।
ব্যতিক্রমগুলি অবশ্যই ত্রুটি নয়। এগুলি কোডের ব্লক এবং আশেপাশের ব্লকগুলি থেকে বেরিয়ে আসার উপায়, ব্যতিক্রমটির জন্য কোনও হ্যান্ডলার পৌঁছানো অবধি পালিয়ে যায়। স্বজ্ঞাত অর্থে এ জাতীয় বিষয়টিকে একটি "ত্রুটি" হিসাবে বিবেচনা করা হবে কিনা তা বিষয়ভিত্তিক।
কিছু ভাষা "ত্রুটি" এবং "ব্যতিক্রম" পদগুলির মধ্যে পার্থক্য তৈরি করে। উদাহরণস্বরূপ, কিছু লিস্প উপভাষার উভয়ই throw
একটি ব্যতিক্রম বাড়াতে হবে (ব্যবহারকারীদের জন্য নিয়ন্ত্রণ প্রবাহ, এমন কোনও উপায়ে স্থানীয়-বহির্গমন প্রস্থান করা বোঝায় যা কিছুতেই ভুল হয়েছে না এমনটি নির্দেশ করে না) এবং signal
ত্রুটি বাড়াতে (যা নির্দেশ করে যে কিছু "ভুল" হয়েছে এবং একটি ডিবাগ ইভেন্ট ট্রিগার করতে পারে)।