রানটাইমে জিনিস ভুল হয় — একটি ফাইল হয়তো নেই, একটি ফর্মের মান হয়তো যা প্রত্যাশিত ছিল তা নয়। PHP-এর try/catch একটি স্ক্রিপ্টকে সরাসরি ক্র্যাশ করতে দেওয়ার বদলে সুন্দরভাবে হ্যান্ডেল করতে দেয়।
<?php
function divide($a, $b) {
if ($b === 0) {
throw new Exception("Cannot divide by zero.");
}
return $a / $b;
}
try {
echo divide(10, 0);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>throw একটি exception তৈরি করে; এর টাইপের সাথে মেলে এমন নিকটতম চারপাশের catch ব্লক সেটা ধরে ফেলে, আর স্ক্রিপ্ট থামার বদলে সেখান থেকে চলতে থাকে।
finally-এর ভেতরের কোড সবসময় চলে, একটি exception তৈরি হোক বা না হোক — যা যেকোনো অবস্থাতেই ঘটতে হবে এমন cleanup-এর জন্য দরকারি, যেমন একটি ফাইল বন্ধ করা:
<?php
try {
echo divide(10, 2);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
} finally {
echo "\nDone.";
}
?>PHP-তে বেশ কিছু বিল্ট-ইন exception টাইপ আছে, আর আপনি একটি সাধারণ Exception-এর আগে একটি বেশি নির্দিষ্ট টাইপ ধরতে পারেন:
<?php
try {
$result = 10 / 0; // DivisionByZeroError, not a regular Exception
} catch (DivisionByZeroError $e) {
echo "Specifically caught: " . $e->getMessage();
} catch (Exception $e) {
echo "General error: " . $e->getMessage();
}
?>নির্দিষ্ট catch ব্লক আগে থাকে
একাধিক টাইপ ধরার সময় ক্রম গুরুত্বপূর্ণ — PHP উপর থেকে নিচে catch ব্লক চেক করে আর প্রথম মিলে যাওয়াটা ব্যবহার করে, তাই একটি নির্দিষ্ট টাইপ সবসময় একটি বেশি সাধারণ টাইপের আগে থাকা উচিত যা নাহলে সেটাকে আগে ধরে ফেলত।
একটি লাইভ PHP সাইটে একটি না-ধরা এরর একটি visitor-এর কাছে সরাসরি একটি raw এরর মেসেজ প্রকাশ করে দিতে পারে — কখনো কখনো ফাইল পাথ বা ডেটাবেসের বিবরণসহ। ঝুঁকিপূর্ণ অপারেশন (ফাইল অ্যাক্সেস, ডেটাবেস কোয়েরি, নিজের স্ক্রিপ্টের বাইরের কিছুর সাথে কথা বলা) try/catch-এ মুড়িয়ে দেওয়াই এটাকে একটি পরিষ্কার, নিয়ন্ত্রিত মেসেজে বদলে দেয়।