এক্সেপশন ব্যবস্থাপনা

কম্পিউটার বিজ্ঞানে এক্সেপশন ব্যবস্থাপনা হলো, এক্সেপশন ব্যবস্থাপনা করে প্রোগ্রামকে সচল রাখার প্রক্রিয়াবিশেষ। এক্সেপশন বলতে বোঝায় এমন একটি ঘটনা যা একটা প্রোগ্রামের স্বাভাবিকভাবে চলাকে ব্যাহত করে। উদাহরণস্বরূপ প্রোগ্রামের কোনো পর্যায়ে কোনো সংখ্যাকে ০ দিয়ে ভাগ করলে এক্সেপশন তৈরি হয়। এক্সেপশন তৈরি হলে প্রোগ্রাম যাতে বন্ধ না হয়ে যায় সে জন্য প্রোগ্রামিং ভাষায় কিছু এক্সেপশন ব্যবস্থাপনার ব্যবস্থা থাকে। এ ব্যবস্থাপনা একেক ভাষার জন্য একেকভাবে কাজ করে। সি, সি++, সি#, ডি, জাভা, পিএইচপি, পাইথন, প্রোলগ, ডট নেট, প্যাস্কেল, রুবি, অ্যাকশন স্ক্রিপ্টসহ বেশিরভাগ প্রোগ্রামিং ভাষায় এক্সেপশন ব্যবস্থাপনা আছে। এসব ভাষায় এক্সেপশন তৈরি হলে স্বয়ংক্রিয়ভাবে স্ট্যাক থেকে যে ফাংশন এক্সেপশন তৈরি করেছে সেটাকে খুজে বের করা হয় এবং প্রোগ্রামের নিয়ন্ত্রণ সেখানে নিয়ে যাওয়া হয়। তবে কমন লিস্প (Common Lisp) এভাবে স্ট্যাকে না খুঁজে স্বাভাবিকভাবে প্রোগ্রামকে এগিয়ে নিয়ে যায়.। যখন একটা মেথডে ইরোর তৈরি হয় তখন মেথডটি একটি অবজেক্ট তৈরি করে এবং সেই অবজেক্টটা রানটাইম সিস্টেমে পাঠিয়ে দেয়। অবজেক্টটিকে বলা হয় এক্সেপশন অবজেক্ট। এতে ইরোরের ধরন সম্পর্কিত তথ্য থাকে। এক্সেপশন তৈরি করা এবং সেটাকে রানটাইম সিস্টেমের কাছে পাঠিয়ে দেয়াকে বলে এক্সেপশন থ্রো করা বা ছুড়ে মারা(throwing an exception)। একটি মেথড এক্সেপশন ছুড়ে দেয়ার পর রান টাইম সিস্টেম সেটার ব্যবস্থাপনার চেষ্টা করে। কল স্ট্যাক এর মধ্যে আগে ব্যবহৃত মেথডগুলোর তালিকা থাকে যা দেখে ইরোরটি যেখানে তৈরি হয়েছে সেখানে ফিরে যাওয়া হয়। এসময় রান টাইম সিস্টেম এক্সেপশন ব্যবস্থাপনাযুক্ত একটি কোডের ব্লক খুজতে থাকে। যদি এক্সেপশন ব্যবস্থাপনা ব্যবহার করা হয় তাহলে সেই কোডটির কাছে অবজেক্টটি পাঠিয়ে দেয়া হয় এবং কোডটি সিদ্ধান্ত নেয় পরবর্তীতে কি করা হবে। যদি এক্সেপশন ব্যবস্থাপনা না পাওয়া যায় তাহলে রানটাইম সিস্টেম বন্ধ হয়ে যায় এবং সাথে সাথে কোডটিও রানটাইম ইরোর প্রদর্শন করে বন্ধ হয়ে যায়। এক্সেপশন ব্যবস্থাপনার সাহায্যে ইরোর সম্পর্কিত কোড এবং মূল কোড পৃথক করা যায়। এক্সেপশন ব্যবস্থাপনা ফাংশন কল স্ট্যাক ব্যবহার করে ইরোরটি কোথায় তৈরি হয়েছে খুজে বের করতে পারে। বিভিন্ন ধরনের ইরোরকে আলাদা আলাদা দলে ভাগ করা যায়। নিচের জাভা কোডে এক্সেপশন ব্যবস্থাপনার উদাহরণ দেখানো হয়েছে। এখানে শূন্য দিয়ে ভাগ করার চেষ্টা করা হয়েছে দেখে এক্সেপশন তৈরি হয়েছে যা "ক্যাচ" করে ইরোর বার্তা প্রদর্শন করা হয়েছে। public class test { public static void main( String argh[]) { int x,divisor=0; try{ x=2/divisor; } catch(ArithmeticException e){ System.out.println("Error, Divisor is zero"); } } } এক্সেপশন ব্যবস্থাপনা ব্যবহার না করলে উপরের কোডটি "Exception in thread "main" java.lang.ArithmeticException: / by zero at test.main(test.java:7)" এরকম বার্তা দেখিয়ে বন্ধ হয়ে যেতো। নিচের সি++ কোডটিতে এক্সেপশন ব্যবস্থা ব্যবহার করে নতুন মেমরি বরাদ্দ করা সম্ভব কিনা যাচাই করা হয়েছে। #include <iostream> #include <exception> using namespace std; int main () { try { int* myarray= new int[1000]; } catch (exception& e) { cout << "Standard exception: " << e.what() << endl; } return 0; } নিচের পাইথন কোডে এক্সেপশন ব্যবস্থাপনা দিয়ে একটি ফাইল থেকে তথ্য পড়া সম্ভব নাকি যাচাই করা হয়েছে। #!/usr/bin/python try: fh = open("testfile", "w") fh.write("This is my test file for exception handling!!") except IOError: print "Error: can\'t find file or read data" else: print "Written content in the file successfully" fh.close() <?php //এক্সেপশন সহ ফাংশন তৈরি function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // try-catch ব্লকের সাহায্যে এক্সেপশন ব্যবস্থাপনা try { checkNum(2); //If the exception is thrown, this text will not be shown echo 'If you see this, the number is 1 or below'; } catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?> try { x = a / b; } catch (e) { alert("b=0"); } ON ERROR GOSUB trap x = a / b ON ERROR GOTO 0 END trap: PRINT "b=0" RESUME http://www.dotnetfunda.com/interview/exam475-what-is-exception-handling.aspx লিস্পে এক্সেপশন ব্যবস্থাপনা, . http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html http://www.boost.org/community/error_handling.html Exceptional practices, Part 2 এক্সেপশন ব্যবস্থাপনার সুবিধা-অসুবিধা সি++ এ এক্সেপসন ব্যবস্থাপনা জাভাতে এক্সেপসন ব্যবস্থাপনা পিএইচপিতে এক্সেপসন ব্যবস্থাপনা পাইথন এ এক্সেপসন ব্যবস্থাপনা সি# এ এক্সেপসন ব্যবস্থাপনা