Exception! I Will Find You And I Will Handle You
Exception কী?
Exception হচ্ছে কোন এক অনাকাঙ্খিত কিংবা অবাঞ্ছিত ঘটনা যা কোডের যে নরমাল ফ্লো তাকে বাধাগ্রস্থ করে। কোডকে যদি আমরা বহমান কোন নদীর সাথে তুলনা করি তবে Exception হচ্ছে ঐ নদীর বাঁধের মত যা নদীর স্বাভাবিক গতিকে বাধাগ্রস্থ করে ফেলে।
Exception Handling আপনার কোডের Exception ঠিক করে দিবে না সত্য; কিন্তু এটি বিকল্প কোন একটা রাস্তা দেখিয়ে দিবে যাতে আপনার বাকি কোডগুলো ঠিকভাবে এক্সিকিউট হয়।
যেমন ধরুণ আপনি প্রতিদিন বাসে অফিস যান অফিস থেকে আবার বাসে করে বাসা ফিরেন। এটাই আপনার প্রতিদিনের স্বাভাবিক জীবন। এখন কোন একদিন অফিস যাওয়ার সময় দেখলেন মটর শ্রমিক ভাইয়েরা অভিমান করে বাস সার্ভিস বন্ধ করে দিয়েছেন। আপনি কি বাস না পেয়ে অফিস যাওয়া বাদ দিয়ে দিবেন? আপনার বস নিশ্চয়ই খুব খুশী হবেন না তাতে।
আপনি খুব বুদ্ধিমান মানুষ বিধায় বাস না পেয়ে সিএনজি করে যাওয়ার সিদ্ধান্ত নিলেন। এতে করে আপনি অফিসেও ঠিক সময়ে পৌছালেন এবং আপনার বস ও রাগ করার সুযোগ পেলো না! কি চমৎকার না?
এই যে বাস না থাকায় আপনার রুটিন কাজ সকালে ঊঠে বাসে করে অফিসে যাওয়াটা বাধাগ্রস্থ হলো এটাই হচ্ছে Exception. আর এই যে আপনি বুদ্ধিমানের মত বাস না পেয়ে বিকল্প উপায়ে অফিসে পৌছালেন যাতে আপনার স্বাভাবিক জীবন বাধাগ্রস্থ না হয় এটাই হচ্ছে Exception Handling!
কোডিং এর ভাষায় যদি বলি তবে ব্যাপারটা এমন দাঁড়ায়-
Try/ catch এইসব দেখে ভয় পাবেন না। খুব তাড়াতাড়ি আমরা সব কিছু বুঝে ফেলবো।
Try Block এর ভিতরে আমরা risky কোডগুলো লিখবো। যে কোডোগুলোর ক্ষেত্রে আমাদের Exception হতে পারে। যেমনঃ
এখন আমরা যদি b এর মান শুন্য দেই সেক্ষেত্রে কী হবে? আমরা জানি শুন্য দিয়ে কোন সংখ্যাকে ভাগ করলে সেটা অসজ্ঞায়িত হয়। অর্থাৎ ফলাফল কি হবে আমরা জানি না। এক্ষেত্রে প্রোগ্রাম ArithmeticException এর শিকার হবে এবং প্রোগ্রাম আর নিচের দিকের কোড এক্সিকিউট করবে না এবং প্রোগ্রাম বন্ধ হয়ে যাবে। এই সমস্যা যাতে না হয় সেজন্য আমাদের এই Risky কোড try ব্লকের মধ্যে লিখতে হবে।
উপরের কোড থেকে আমরা দেখতে পাচ্ছি আমরা আমাদের রিস্কি কোড try ব্লকের মধ্যে লিখেছি এবং কোন মানের জন্য যদি আমাদের Exception আসে সেক্ষেত্রে প্রোগ্রাম টারমিনেট না হয়ে কি করবে সেটা আমরা catch ব্লকে বলে দিয়েছি। এখন চিন্তা করে বের করুন, যদি আপনি b এর মান শুন্য দেন সেক্ষেত্রে এই কোড কি রেজাল্ট দেখাবে?
একটি Try ব্লকের জন্য একাধিক Catch ব্লক থাকতে পারে।
Try, Catch ব্লক ছাড়াও Finally ব্লক নামে আরো একটি ব্লক থাকতে পারে। এখন প্রশ্ন হতে পারে Try block এ আমরা রিক্সি কোড লিখছি। try ব্লকে Exception দেখা দিলে কি করতে হবে সেটা catch ব্লকে লিখেছি তাহলে finally ব্লকে আমরা কী লিখবো? Finally ব্লকে আমরা clean up কোড লিখবো। যেমনঃ Database Connection close করা, File বন্ধ করা ইত্যাদি।
আর একটা কথা মনে রাখতে হবে কোডে Exception ঘটুক আর নাই ঘটুক finally block সবসময় এক্সিকিউট হবেই। অনেকটা রবিন্দ্রনাথের সেই কবিতার মত-”ফুল ফুটুক আর নাই ফুটুক আজ বসন্ত।”
Exception দুই প্রকার।
১) Checked Exception
২) Unchecked Exception
Checked Exception হচ্ছে যে Exception গুলো কম্পাইলার চেক করে দেখে সব ঠিকঠাক আছে কি না। যদি কম্পাইলার কোড নিয়ে সন্তুষ্ট না থাকে, সে যদি বুঝতে পারে কোডে risk আছে এবং সেই রিক্সি কোডগুলোর Exception Handling করা হয় নি। ফলে কোড Run করলে ভয়াবহ সমস্যা(Exception) সৃষ্টি হয়ে যাবে তাহলে কম্পাইলার সাথে সাথে Checked Exception ধরবে এবং যতক্ষণ পর্যন্ত প্রোগ্রামে Exception Handling করা হবে না ততক্ষণ সে গোঁ ধরে compile time error দেখাতেই থাকবে। কয়েকটি Checked Exception হচ্ছেঃ IOException, SQLException,ClassNotFoundException ইত্যাদি।
এই Checked Exception দুইভাবে Handle করা যায়ঃ
১) Try-catch block
২) throws keyword
try-catch সম্পর্কে তো আগেই বলে নিয়েছি। এখন আসি throws নিয়ে। কম্পাইলারকে অনেক সময় বুঝানোর প্রয়োজন পরে যে আসলে সে সেটা রিক্সি কোড ভাবছে সেটা নিয়ে তার মাথা ব্যথা না করলেও চলবে। ব্যাপারটা কম্পাইলার নিজের কাঁধে না নিয়ে আমদের কাঁধে দিয়ে দিক এবং সেক্ষেত্রে এক্সসেপশন না ধরে প্রোগ্রাম রান করতে দিক, বাকিটা আমরা ম্যানেজ করে নিব। এই যে কম্পাইলারকে কনভিন্স করে Checked Exception থেকে বাঁচার জন্য throws keyword ব্যবহার করা হয়। কিন্তু এটা abnormal termination থেকে কোডকে বাঁচাতে পারে না। যদি Exception raise হয় সেক্ষেত্রে কোড টারমিনেট হয়ে যাবে। throws keyword ব্যবহার করলে Exception Handling এর গুরু দায়িত্ব আর কম্পাইলের উপর থাকে না সেটা চলে যায় caller এর উপর। মনে রাখা ভাল throws keyword শুধুমাত্র method এবং constructor এর ক্ষেত্রে ইউজ হয়।
এখন আসি Unchecked Exception এর ব্যাপারে। Unchecked Exception নাম শুনেই বুঝতে পারছেন এই Exception গুলো কম্পাইলার চেক করে দেখে না। যেমনঃ ArithmeticException, NullPointerException ইত্যাদি।
অনেক ভারি ভারি কথার পর একটু সহজ কথা বলা যাক। আপনি বাসা থেকে বাইরে যাওয়ার আগে কি কি চেক করে বের হন? মানিব্যাগ, মোবাইল, চাবি এইতো। এগুলো আপনার প্রয়োজনীয় জিনিস। এইগুলো ঠিকমত আছে কি না সেটা আপনার চেক করা দরকার। ঠিক আছে। সব চেক করে নিয়ে আপনি বাসা থেকে বের হলেন। বের হওয়ার পর ছিনতাইকারি আপনার মানিব্যাগ নিয়ে আপনাকে গুলি করে চলে গেল! বুলেট প্রুফ ভেস্ট পরে থাকলে কিন্তু এই সমস্যাটা হত না। আপনি বুলেট প্রুফ ভেস্ট পরেন নি কারণ ছিনতাইকারীর হামলা সচারাচর হয় না আর হলেও তারা গুলি করে না। তাই বাসা থেকে বের হওয়ার সময় আপনার চেক করার দরকার পরে নি আপনি বুলেট প্রুফ ভেস্ট পরেছেন কি না। যা হয়েছে পুরাটাই অনাকাঙ্ক্ষিত।
তেমনি কম্পাইলার ও কিছু Exception চেক করে দেখে যাতে প্রোগ্রাম ঠিক ভাবে রান হতে পারে। মানিব্যাগ নিয়ে না গেলে রিকশাওয়ালা ভাড়া চাইলে আপনার MonneyBagNotFoundException দেখা দিতে পারে। এই Exception যাতে দেখা না দেয় সেজন্য বাসা থেকে বের হওয়ার আগে চেক করে দেখতে হবে যাতে আপনার বাইরে গমন নির্ভেজাল এবং Exception মুক্ত হয়। এটাই checked Exception।
কিন্তু তারপরেও বাইরে যাওয়ার পর অন্যান্য সমস্যা(Exception) দেখা দিতে পারে যেমনঃ ছিনতানিকারী গুলি করতে পারে। এক্ষেত্রে BulletProofVesTNotFoundException দেখা দিতে পারে এবং আপনি মারা যেতে পারেন। কিন্তু এটা বাসা থেকে বের হওয়ার আগে বোঝার উপায় নেই কারণ তা সচরাচর হয় না। সেজন্য এই Exception কম্পাইলার চেক করে দেখবে না, আর এটাই Unchecked Exception.
মাঝে মাঝে কোডে Exception দেখা না দিলেও আমরা নিজেরাই Exception তৈরি করি এবং তা JVM এর কাছে পাঠিয়ে দেই। এটাকে বলে Customized Exception or User defined Exception. Customized Exception তৈরি করার জন্য throw keyword ইউজ করা হয়।
Exception Handling নিয়ে অনেক কিছু লিখলাম। পরবর্তীতে এটা নিয়ে আরো লিখবো আশা করি। ততদিন পর্যন্ত টা টা বাই বাই।
ঈশপের প্রতিটি গল্পে মোরাল থাকে। আমার এই লেখার মধ্যেও মোরাল আছে। সেই মোরাল দিয়েই শেষ করছি।
মোরালঃ জীবনে অনেক বাধা বিপত্তি আসবে। অনেক বাধা আপনাকে থামিয়ে দেয়ার চেষ্টা করবে। কিন্তু কোন Exception এই থেমে থাকা যাবে না, টারমিনেট হয়ে যাওয়া যাবে না। মনে রাখতে হবে বাধা পেয়ে টারমিনেট হয়ে যাওয়াই জীবন নয় বরং প্রতিটি বাধা(Exception) কাটিয়ে তুলে এর যথাযথ Handling করে জীবনের গতি ঠিক রাখার নামই জীবন। জীবনে যেখানেই Exception দেখবেন সেখানেই বলে উঠবেন-