আপনি অর্থবহ কিছু করার ইচ্ছা না করেই আপনি ব্যতিক্রমটি ধরবেন না ।
"অর্থপূর্ণ কিছু" এর মধ্যে একটি হতে পারে:
ব্যতিক্রম হ্যান্ডেলিং
সর্বাধিক সুস্পষ্ট অর্থবোধক ক্রিয়াটি ব্যতিক্রমটি পরিচালনা করা, যেমন কোনও ত্রুটি বার্তা প্রদর্শন করে এবং অপারেশনটি বাতিল করে দেওয়া:
try {
$connect = new CONNECT($db, $user, $password, $driver, $host);
}
catch (Exception $e) {
echo "Error while connecting to database!";
die;
}
লগিং বা আংশিক পরিষ্কার
কখনও কখনও আপনি নির্দিষ্ট প্রসঙ্গের মধ্যে কীভাবে একটি ব্যতিক্রমটি সঠিকভাবে পরিচালনা করবেন তা জানেন না; সম্ভবত "বড় ছবি" সম্পর্কে আপনার অভাব রয়েছে, তবে আপনি ব্যর্থতাটি যতটা সম্ভব ঘটেছে তার ঠিক কাছেই লগ করতে চান। এই ক্ষেত্রে, আপনি ধরা, লগ এবং পুনরায় নিক্ষেপ করতে চাইতে পারেন:
try {
$connect = new CONNECT($db, $user, $password, $driver, $host);
}
catch (Exception $e) {
logException($e); // does something
throw $e;
}
সম্পর্কিত পরিস্থিতি হ'ল ব্যর্থ ক্রিয়াকলাপের জন্য কিছু পরিষ্কার করার জন্য আপনি যেখানে সঠিক জায়গায় রয়েছেন, কিন্তু ব্যর্থতা কীভাবে শীর্ষ স্তরে পরিচালনা করা উচিত তা সিদ্ধান্ত নেওয়া হয়নি। পূর্ববর্তী পিএইচপি সংস্করণগুলিতে এটি হিসাবে প্রয়োগ করা হবে
$connect = new CONNECT($db, $user, $password, $driver, $host);
try {
$connect->insertSomeRecord();
}
catch (Exception $e) {
$connect->disconnect(); // we don't want to keep the connection open anymore
throw $e; // but we also don't know how to respond to the failure
}
পিএইচপি 5.5 finally
কীওয়ার্ডটি চালু করেছে , তাই সাফের দৃশ্যপটের জন্য এখন আরও একটি উপায় রয়েছে এটির কাছে যাওয়ার জন্য। যদি ক্লিনআপ কোডটি যা ঘটেছিল তা চালানোর প্রয়োজন নেই (যেমন ত্রুটি এবং সাফল্য উভয়ই) কোনও নিক্ষিপ্ত ব্যতিক্রম প্রচারের স্বচ্ছতার সাথে করে এখন এটি করা সম্ভব:
$connect = new CONNECT($db, $user, $password, $driver, $host);
try {
$connect->insertSomeRecord();
}
finally {
$connect->disconnect(); // no matter what
}
ত্রুটি বিমূর্তকরণ (ব্যতিক্রম শৃঙ্খলা সহ)
তৃতীয় কেস হ'ল যেখানে আপনি যুক্তিসঙ্গতভাবে একটি বড় ছাতার নিচে সম্ভাব্য অনেকগুলি ব্যর্থতা গোষ্ঠী করতে চান। যৌক্তিক গোষ্ঠীকরণের জন্য একটি উদাহরণ:
class ComponentInitException extends Exception {
// public constructors etc as in Exception
}
class Component {
public function __construct() {
try {
$connect = new CONNECT($db, $user, $password, $driver, $host);
}
catch (Exception $e) {
throw new ComponentInitException($e->getMessage(), $e->getCode(), $e);
}
}
}
এই ক্ষেত্রে, আপনি ব্যবহারকারীদের Component
এটি জানতে চান না যে এটি একটি ডেটাবেস সংযোগ ব্যবহার করে প্রয়োগ করা হয়েছে (সম্ভবত আপনি আপনার বিকল্পগুলি উন্মুক্ত রাখতে চান এবং ভবিষ্যতে ফাইল-ভিত্তিক স্টোরেজ ব্যবহার করতে চান)। সুতরাং আপনার স্পেসিফিকেশনটি Component
বলবে যে "একটি সূচনা ব্যর্থতার ক্ষেত্রে ComponentInitException
নিক্ষেপ করা হবে"। এটি গ্রাহকরা Component
প্রত্যাশিত ধরণের ব্যতিক্রমগুলি ধরতে পারবেন এবং ডিবাগিং কোডকে সমস্ত (প্রয়োগ-নির্ভর) বিশদটি অ্যাক্সেস করার অনুমতি দেবেন ।
সমৃদ্ধ প্রসঙ্গ সরবরাহ করা (ব্যতিক্রম শৃঙ্খলা সহ)
অবশেষে, এমন কেস রয়েছে যেখানে আপনি ব্যতিক্রমের জন্য আরও প্রসঙ্গ সরবরাহ করতে চাইতে পারেন। এক্ষেত্রে এটি ব্যতিক্রমটিকে অন্য একটিতে গুটিয়ে ফেলা বোধগম্য হয় যা ত্রুটি হওয়ার সময় আপনি কী করার চেষ্টা করেছিলেন সে সম্পর্কে আরও তথ্য ধারণ করে। উদাহরণ স্বরূপ:
class FileOperation {
public static function copyFiles() {
try {
$copier = new FileCopier(); // the constructor may throw
// this may throw if the files do no not exist
$copier->ensureSourceFilesExist();
// this may throw if the directory cannot be created
$copier->createTargetDirectory();
// this may throw if copying a file fails
$copier->performCopy();
}
catch (Exception $e) {
throw new Exception("Could not perform copy operation.", 0, $e);
}
}
}
এই কেসটি উপরের মতই (এবং উদাহরণটি সম্ভবত সেরাটি সামনে আসতে পারে নি) তবে এটি আরও প্রসঙ্গ সরবরাহ করার বিষয়টি চিত্রিত করে: যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয়, তবে এটি আমাদের জানায় যে ফাইলের অনুলিপি ব্যর্থ হয়েছে। তবে কেন ব্যর্থ হল? এই তথ্যটি মোড়ানো ব্যতিক্রমগুলিতে সরবরাহ করা হয় (যার মধ্যে উদাহরণটি আরও জটিল হলে একাধিক স্তর থাকতে পারে)।
এটি করার মানটি উদাহরণস্বরূপ যদি আপনি এমন কোনও দৃশ্যের কথা চিন্তা করেন যেখানে কোনও UserProfile
বস্তু তৈরি করা ফাইলগুলি অনুলিপি করে দেয় কারণ ব্যবহারকারী প্রোফাইল ফাইলগুলিতে সঞ্চিত থাকে এবং এটি লেনদেন শব্দার্থকে সমর্থন করে: আপনি পরিবর্তনগুলি "পূর্বাবস্থায়" ফেলতে পারেন কারণ সেগুলি কেবলমাত্র একটিতে সম্পাদিত হয় আপনার প্রতিশ্রুতি না দেওয়া পর্যন্ত প্রোফাইলের অনুলিপি।
এই ক্ষেত্রে, আপনি যদি
try {
$profile = UserProfile::getInstance();
}
এবং ফলস্বরূপ একটি "টার্গেট ডিরেক্টরি তৈরি করা যায়নি" ব্যতিক্রম ত্রুটি, আপনার বিভ্রান্ত হওয়ার অধিকার থাকবে। প্রসঙ্গটি সরবরাহ করে এমন অন্যান্য ব্যতিক্রমের স্তরগুলিতে এই "মূল" ব্যতিক্রমটি মুড়িয়ে ফেলা ত্রুটিটিকে মোকাবেলা করা আরও সহজ করে দেবে ("প্রোফাইলের অনুলিপি তৈরি করা ব্যর্থ হয়েছে" -> "ফাইল অনুলিপি অপারেশন ব্যর্থ হয়েছে" -> "টার্গেট ডিরেক্টরি তৈরি করা যায়নি")।