পিএইচপি - ১০ [ফিল্টার, এডভান্স ফিল্টার, Error হ্যান্ডেলিং, এক্সেপশন হ্যান্ডেলিং] - SMH Amiri

সর্বশেষ লিখাসমূহ

পিএইচপি - ১০ [ফিল্টার, এডভান্স ফিল্টার, Error হ্যান্ডেলিং, এক্সেপশন হ্যান্ডেলিং]



ফিল্টার

পিএইচপি ফিল্টার এক্সটেনশন এর মাধ্যমে ডেটা ফিল্টার এবং এর মধ্য থেকে আগাছা পরিষ্কার (sanitizing) করা। এটি কিছু কিছু ক্ষেত্রে খুবই সহায়ক, বিশেষকরে ডেটার উৎস যখন আমাদের কাছে অজানা থাকে। উদাহরণস্বরূপঃ এই সকল ডেটা এইচটিএমএল ফরম এর মাধ্যমে আসতে পারে।

পিএইচপি ফিল্টার এর প্রকারভেদ

পিএইচপিতে দুই ধরণের ফিল্টারিং ব্যবহৃত হয়। যেমন-

  • Validating data - ডেটাসমূহের গঠন যথাযথ উপায়ে আছে কিনা চেক করে।
  • Sanitizing data - ডেটাসমূহের মধ্য থেকে যেকোন অপ্রত্যাশিত ক্যারেক্টার সরিয়ে ফেলে।

পিএইচপি ফিল্টার এক্সটেনশন

পিএইচপি ফিল্টারের মাধ্যমে বাহ্যিক ইনপুটগুলোকে ভ্যালিডেট এবং স্যানিটাইজ(sanitize) করা হয়।

পিএইচপি ফিল্টার এক্সটেনশনের মধ্যে ইউজার ইনপুট চেক করার জন্য অনেকগুলো ফাংশন রয়েছে এবং ডেটা ভ্যালিডেশন সহজে এবং দ্রুত করার জন্য এটি ডিজাইন করা হয়েছে।

পিএইচপি ফিল্টার এক্সটেনশনের মাধ্যমে আপনি কি কি সুবিধা পেতে পারেন তা জানার জন্য filter_list() ফাংশনটি ব্যবহার করতে পারেনঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<table>
  <tr>
    <td>ফিল্টার এর নাম</td>
    <td>ফিল্টার আইডি</td>
  </tr>
  <?php
   foreach (filter_list() as $id =>$filter) {
      echo '<tr><td>' . $filter . '</td><td>' . filter_id($filter) . '</td></tr>';
  }
  ?>
</table>

</body>
</html>


ফলাফল
ফিল্টার নামফিল্টার আইডি
int257
boolean258
float259
validate_regexp272
validate_domain277
validate_url273
validate_email274
validate_ip275
validate_mac276
string513
stripped513
encoded514
special_chars515
full_special_chars522
unsafe_raw516
email517
url518
number_int519
number_float520
magic_quotes521
add_slashes523
callback1024

কেন ফিল্টার ব্যবহার করবেন?

অধিকাংশ ওয়েব এপ্লিকেশনেই বাহ্যিক সোর্স থেকে ইনপুট গ্রহন করতে হয়। নিম্নোক্ত উৎস হতে বাহ্যিক ইনপুট/ডেটা আসতে পারেঃ

  • এইচটিএমএল ফরম থেকে ইউজার ইনপুট
  • কুকি
  • সার্ভার ভ্যারিয়েবল
  • ডেটাবেস কুয়েরি থেকে প্রাপ্ত ফলাফল
  • ওয়েব সার্ভিস ডেটা

কেন আপনি বাহ্যিক উৎস হতে প্রাপ্ত ডেটা সর্বদাই ভ্যালিডেট করবেন?
ইনভ্যালিড ডেটা সাবমিট আপনার ওয়েব এপ্লিকেশনে সিকিউরিটি জনিত সমস্যা সৃষ্টি করতে পারে। এমনকি আপনার ওয়েবপেজকে ধ্বংসও করে দিতে পারে!
পিএইচপি ফিল্টার ব্যবহারের মাধ্যমে আপনি আপনার এপ্লিকেশনে সঠিক ইনপুট নিশ্চিত করতে পারেন!


পিএইচপি filter_var() ফাংশন

ডেটা ভ্যালিডেট এবং স্যানিটাইজ একসাথে সম্পন্ন করার জন্য filter_var() ফাংশন ব্যবহার করা হয়।

filter_var() ফাংশনটি একটি নির্দিষ্ট ফিল্টারের মাধ্যমে একক ভ্যারিয়েবলকে ফিল্টার করে।

filter_var এর সিনট্যাক্স

filter_var (variable, filter, options)

প্যারামিটার এর ব্যাখ্যা

  • variable - আবশ্যক। যে ভ্যালুটি আপনি ফিল্টার/চেক করতে চান।
  • filter - ঐচ্ছিক। ফিল্টার এর যে আইডি/টাইপ প্রয়োগ করবেন।
  • options - ঐচ্ছিক। অপশন এর এসোসিয়েটিভ অ্যারে।

Integer ভ্যালিডেশন

নিম্নের উদাহরণে প্রথমে filter_var() ফাংশনের মাধ্যমে $integer ভ্যারিয়েবলটি integer কিনা চেক করবে। যদি $integer ভ্যারিয়েবলটি integer হয় তাহলে আউটপুট হবেঃ " ভ্যালিড ইন্টিজার"। আর যদি $integer ভ্যারিয়েবলটি integer না হয়, তবে আউটপুট হবেঃ "ইন্টিজার ভ্যালিড নয়"।

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$integer = 999;
if (filter_var($integer, FILTER_VALIDATE_INT) !== false) {
    echo(" ভ্যালিড ইন্টিজার  ");
} else {
    echo(" ইন্টিজার ভ্যালিড নয়");
}
?>

</body>
</html>


ফলাফল
 ভ্যালিড ইন্টিজার

filter_var() এবং 0 নিয়ে সমস্যার সমাধান

উপরের উদাহরণে যদি $integer ভ্যারিয়েবলে 0 সেট করা হয় তাহলে ফাংশনটি "ইন্টিজার ভ্যালিড নয়" রিটার্ন করবে। এই সমস্যা সমাধান করার জন্য নিচের উদাহরণটি অনুসরণ করুন।

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$integer = 0;
if (filter_var($integer, FILTER_VALIDATE_INT) === 0 || filter_var($integer, FILTER_VALIDATE_INT) !== false) {
    echo("ভ্যালিড ইন্টিজার");
} else {
    echo("ইন্টিজার ভ্যালিড নয়");
?>

</body>
</html>


ফলাফল
 ভ্যালিড ইন্টিজার  

স্ট্রিং স্যানিটাইজ

নিচের উদাহরণে filter_var() ফাংশন ব্যবহার করে একটি স্ট্রিং থেকে সকল এইচটিএমএল ট্যাগ সরিয়ে ফেলা হয়েছেঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$string = "<h1>স্যাট একাডেমীতে আপনাকে স্বাগতম।</h1>";
echo filter_var($string, FILTER_SANITIZE_STRING);
?>

</body>
</html>


ফলাফল
স্যাট একাডেমীতে আপনাকে স্বাগতম।

IP এড্রেস ভ্যালিডেশন

নিচের উদাহরণে filter_var() ফাংশন ব্যবহার করে IP এড্রেস ভ্যালিড কিনা চেক করা হয়েছেঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$ip = "192.168.10.10";
if (filter_var($ip, FILTER_VALIDATE_IP) !== false) {
    echo("$ip একটি ভ্যালিড IP এড্রেস");
} else {
    echo("$ip ভ্যালিড IP এড্রেস নয়");
}
?>

</body>
</html>


ফলাফল
192.168.10.10 একটি ভ্যালিড IP এড্রেস

ইমেইল এড্রেস ভ্যালিডেট এবং স্যানিটাইজ করা

নিম্নের উদাহরণে filter_var() ফাংশন এর মাধ্যমে ইমেইল এড্রেস ভ্যালিড কিনা চেক করা হয়েছেঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$email = "azizur.rahman@example.com";
// ইমেইল থেকে সকল অপ্রত্যাশিত ক্যারেক্টার দুরা করা
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// ভ্যালিডেট ই-মেইল
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false) {
    echo("$email একটি ভ্যালিড ইমেইল এড্রেস।");
} else {
    echo("$email ভ্যালিড ইমেইল এড্রেস নয়।");
}
?>

</body>
</html>


ফলাফল
azizur.rahman@example.com একটি ভ্যালিড ইমেইল এড্রেস।

URL স্যানিটাইজ এবং ভ্যালিডেট করা

নিম্নের উদাহরণে filter_var() ফাংশনটি URL থেকে অপ্রত্যাশিত ক্যারক্টারগুলো সরিয়ে ফেলে এবং $url টি ভ্যালিড কিনা চেক করেঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$url = "http://www.sattacademy.com";

// URL থেকে সকল অপ্রত্যাশিত ক্যারেক্টার সরিয়ে ফেলে
$url = filter_var($url, FILTER_SANITIZE_URL);

// ভ্যালিড url কিনা চেক করে
if (filter_var($url, FILTER_VALIDATE_URL) !== false) {
    echo("$url একটি ভ্যালিড URL");
} else {
    echo("$url ভ্যালিড URL নয়");
}
?>

</body>
</html>


ফলাফল
http://www.sattacademy.com একটি ভ্যালিড URL



এডভান্স ফিল্টার

নির্দিষ্ট ব্যবধীর মধ্যে Integer ভ্যালিডেশন

filter_var() ফাংশন ব্যবহার করে আপনি নির্দিষ্ট ব্যবধীর মধ্যে ইন্টিজার আছে কিনা চেক করতে পারবেন।

নিন্মের উদাহরণে filter_var() ফাংশনের মাধ্যমে একটি ভ্যারিয়েবল integer এবং এটি ১ থেকে ৩০০ এর মধ্যে আছে কিনা চেক করা হয়েছেঃ

উদাহরণ

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$integer = 150;
$min = 1;
$max = 300;
if (filter_var($integer, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) !== false) {
    echo("ভ্যারিয়েবলের ভ্যালু  ব্যবধীর মধ্যে রয়েছে।");
} else {
    echo("ভ্যারিয়েবলের ভ্যালু ব্যবধীর  মধ্যে নাই।");
}
?>

</body>
</html>


ফলাফল
ভ্যারিয়েবলের ভ্যালু  ব্যবধীর মধ্যে রয়েছে।

IPv6 এড্রেস ভ্যালিডেশন

নিম্নের উদাহরণে filter_var() ফাংশনের মাধ্যমে $ip_address ভ্যারিয়েবল এর ভ্যালু IPv6 এড্রেস ভ্যালিড কিনা চেক করা হয়েছেঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$ip_address = "ffff:ffff:ffff:ffff:208:dbff:feef:3433";
if (filter_var($ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
    echo("$ip_address একটি ভ্যালিড IPv6 এড্রেস");
} else {
    echo("$ip_address ভ্যালিড IPv6 এড্রেস নয়");
}
?>

</body>
</html>


ফলাফল
ffff:ffff:ffff:ffff:208:dbff:feef:3433 একটি ভ্যালিড IPv6 এড্রেস

কুয়েরি স্ট্রিংসহ URL ভ্যালিডেশন

নিম্নের উদাহরণে filter_var() ফাংশন এর মাধ্যমে $url ভ্যারিয়েবলটি query string যুক্ত URL কিনা চেক করা হয়েছেঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি ফিল্টার উদাহরণ</title>
</head>
<body>

<?php
$url = "http://sattacademy.com/index.index?user=tamim";

if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) !== false) {
    echo("$url একটি ভ্যালিড URL");
} else {
    echo("$url ভ্যালিড URL নয়");
}
?>

</body>
</html>


ফলাফল
http://sattacademy.com/index.index?user=tamim একটি ভ্যালিড URL


Error হ্যান্ডেলিং


পিএইচপির ডিফল্ট error হ্যান্ডেলিং খুবই সাধারন। এটি ফাইলের নাম, লাইনের নাম্বার এবং error এর বিবরণসহ ব্রাউজারে একটি মেসেজ পাঠায়।


পিএইচপি Error হ্যান্ডেলিং

আপনি যখন পিএইচপি স্ক্রিপ্ট এবং ওয়েব এপ্লিকেশন তৈরি করবেন তখন প্রায় সময়েই আপনাকে বিভিন্ন ধরণের error এর সম্মুখিন হতে হবে। তাই যেকোনো স্ক্রিপ্ট এবং ওয়েব এপ্লিকেশনের ক্ষেত্রে error নিয়ন্ত্রণ(handling) সম্মন্ধে জানা অত্যাবশ্যক।

আপনার কোড/এপ্লিকেশন এর মধ্যে যদি error চেক করার জন্য কোনো কোড না থাকে, তাহলে এই কোডগুলো অনেকটা অপেশাদার ডেভেলপার কর্তৃক লেখা কোড এর মত দেখাবে। এছাড়া এটি আপনার এপ্লিকেশন এর নিরাপত্তা ঝুঁকিও বাড়িয়ে দিতে পারে।

এই টিউটোরিয়ালে আমরা পিএইচপির বহুল ব্যবহত error নিয়ন্ত্রণে রাখার কিছু মেথড সম্মন্ধে আলোচনা করেছি।

  • "die()" ফাংশন
  • ইউজার কর্তৃক error তৈরি এবং error ট্রিগার/কল করা
  • এরর রিপোর্ট করা

এরর নিয়ন্ত্রণে die() ফাংশন এর ব্যবহার

নিন্মের উদাহরণের মাধ্যমে একটি এইচটিএমএল ফাইল ওপেন করার চেষ্টা করা হয়েছে। কিন্তু ফাইলটি বিদ্যমান না থাকায় সিস্টেম কর্তৃক এরর উৎপন্ন হবে।

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
 $file=fopen("test.html","r");
?>

</body>
</html>


ফলাফল
( ! ) Warning: fopen(test.html): failed to open stream: No such file or directory in C:\Users\Azizur Rahman\Dropbox\satt_develop\php\php-error.php on line 9
Call Stack
#TimeMemoryFunctionLocation
10.0005235896{main}( )...\php-error.php:0
20.0005236104fopen ( )...\php-error.php:55


উপরের error মেসেজ প্রতিরোধ করার জন্য আপনি ফাইলটি এক্সেস করার আগে ফাইলটি আছে কিনা চেক করে নিতে পারেন। ফাইলটি যদি বিদ্যমান না থাকে তবে আপনি die() ফাংশন এর মাধ্যমে একটি error মেসেজ দেখাতে পাবেনঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
if(!file_exists("test.html")) {
  die("ফাইলটি পাওয়া যায়নি!");
} else {
  $file=fopen("test.html","r");
}
?>

</body>
</html>


ফলাফল
ফাইলটি পাওয়া যায়নি!

দ্বিতীয় উদাহরণের কোডগুলো প্রথম উদাহরণের কোডগুলোর চেয়ে বেশী কার্যকরী, কারন এটি error ঘটার সঙ্গে সঙ্গে একটি এরর মেসেজ উৎপন্ন করে এবং স্ক্রিপ্ট এক্সিকিউশন বন্ধ করে দেয়।

যাইকোক শুধুমাত্র স্ক্রিপ্ট এক্সিকিউশন বন্ধ করা সবসময় সঠিক পদ্ধতি নাও হতে পারে। তাই চলুন সঠিক পদ্ধতিতে error হ্যান্ডেলিং করার জন্য পিএইচপির আরও কার্যকরী ফাংশনগুলো দেখে নিই।


নিজস্ব Error হ্যান্ডেলার তৈরি

কাস্টম/নিজস্ব error হ্যান্ডেলার তৈরি করা খুবই সহজ। এটি করার জন্য আমরা সাধারণত একটি বিশেষ ফাংশন তৈরি করবো যা পিএইচপি কোডে কোনো এরর সংঘটিত হলেই স্বয়ংক্রিয়ভাবে কল হবে।

এই ফাংশনটির কমপক্ষে দুটি প্যারামিটার(যেমন- error_level এবং error_message) হ্যান্ডেল করার সক্ষমতা থাকতে হবে। যাইহোক এটি পাঁচটি পর্যন্ত প্যারামিটার গ্রহন করতে পারে।

সিনট্যাক্স

error_function(error_level,error_message,
    error_file,error_line,error_context)


প্যারামিটার এর ব্যাখ্যা

  • error_level - আবশ্যক। error এর লেভেল নির্দেশ করে। এই ভ্যালুটি অবশ্যই একটি নাম্বার হতে হবে।
  • error_message - আবশ্যক। error এর জন্য একটি error মেসেজ নির্ধারণ করে।
  • error_file - ঐচ্ছিক। error সংঘটিত ফাইলকে নির্দেশ করে।
  • error_line - ঐচ্ছিক। error সংঘটিত লাইনকে নির্দেশ করে।
  • error_context - ঐচ্ছিক। যখন কোনো error সংগঠিত হয়, তখন সকল ভ্যারিয়েবল এবং তাদের ভ্যালু গুলো ধারন করার জন্য একটি array নির্দিষ্ট করে।

Error এর বিভিন্ন লেভেল

পিএইচপিতে বিভিন্ন টাইপের এরর সংঘটির হয়। নিম্নে error লেভেল এর ভ্যালুসহ বর্ণনা তুলে ধরা হল

ভ্যালুকনস্ট্যান্টবর্ণনা
1E_ERRORFatal run-time errors. এটা ঐ ধরণের এরর কে নির্দেশ করে যা রিকাভার(recover) করা যায়। যেমন- মেমোরি এলোকেশন। এটি স্ক্রিপ্ট এর এক্সিকিউশন থামিয়ে দেয়।
2E_WARNINGFatal run-time errors। স্ক্রিপ্ট এর এক্সিকিউশন বন্ধ হবে না।
4E_PARSECompile-time parse errors। এই ধরণের এরর পার্সার কর্তৃক উৎপন্ন হয়।
8E_NOTICERun-time notices। স্ক্রিপ্টে এমন কিছু কোড থেকে যেখানে সম্ভবত এরর থাকতে পারে। এক্ষেত্রে স্ক্রিপ্টটি স্বাভাবিকভাবেই এক্সিকিউশন হয়।
16E_CORE_ERRORFatal errors। পিএইচপি শুরু হওয়ার সময়ই এধরণের এরর ঘটে। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি কোর পিএইচপি কর্তৃক উৎপন্ন হয়।
32E_CORE_WARNINGWarnings (non-fatal errors)। পিএইচপি শুরু হওয়ার সময়ই এধরণের এরর ঘটে। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি কোর পিএইচপি কর্তৃক উৎপন্ন হয়।
64E_COMPILE_ERRORFatal compile-time errors। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি জেন্ড ইঞ্জিন কর্তৃক উৎপন্ন হয়।
128E_COMPILE_WARNINGCompile-time warnings (non-fatal errors)। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি জেন্ড ইঞ্জিন কর্তৃক উৎপন্ন হয়।
256E_USER_ERRORUser-generated error messager। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি পিএইচপি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়।
512E_USER_WARNINGUser-generated warning message। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়।
1024E_USER_NOTICEUser-generated notice message। এটি E_NOTICE এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়।
2048E_STRICTEnable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code.
8192E_DEPRECATEDRun-time notices. এটি Enable করা থাকলে যে সকল কোড পিএইচপির পরবর্তী ভার্সনে সাপোর্ট করবে না তাদের জন্য এমন ম্যাসেজ পাওয়া যায়।
4096E_RECOVERABLE_ERRORCatchable fatal error। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি ব্যবহারকারী কর্তৃক নিয়ন্ত্রণ করা সম্ভব।
16384E_USER_DEPRECATEDUser-generated warning message। এটি E_DEPRECATED এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়।
32767E_ALLসব ধরণের errors এবং warnings রিটার্ন করে

Error হ্যান্ডেল এর জন্য ফাংশন তৈরি

পিএইচপি Error হ্যান্ডেল করার জন্য চলুন প্রথমেই একটি ফাংশন তৈরি করে নিই।

function customError($err_level, $error_message ) {
  echo "<strong>Error:</strong> [$err_level] $error_message<br>";
  echo "The script is End";
  die();
}

উপরের কোডগুলোর সমন্বয়ে আমরা একটি সাধারন error হ্যান্ডেলার ফাংশন(customError) তৈরি করেছি। এই ফাংশনটি কোনোভাবে ট্রিগার/কল হলেই এটি error লেভেল এবং error মেসেজ প্রদান করবে এবং স্ক্রিপ্টট এর সমাপ্তি(terminate) ঘটাবে।

আমাদের প্রথম কাজ error হ্যান্ডেলিং ফাংশন তৈরি করা যা উপরের কোড এর মাধ্যমে সম্পন্ন করলাম। পরবর্তী ধাপে এটি ট্রিগার হওয়ার সময় নির্ধারন করে দিব।


Error হ্যান্ডেলার সেট

পিএইচপির নিজস্ব error হ্যান্ডেলার ফাংশনসমূহই হলো পিএইচপির ডিফল্ট error হ্যান্ডেলার। কিন্তু আমরা উপরের error হ্যান্ডেলার ফাংশনটিকে ডিফল্ট error হ্যান্ডেলার হিসেবে সেট করতে যাচ্ছি।

আপনি চাইলে নির্দিষ্ট কিছু error এ error হ্যান্ডেলার প্রয়োগ করতে পারেন। এই পদ্ধতি অবলম্বন করলে আপনি স্ক্রিপ্ট এর বিভিন্ন error বিভিন্ন উপায়ে হ্যান্ডেল করতে পারবেন।

যাইহোক, নিন্মের উদাহরণে পিএইচপির সকল error এর জন্য আমরা আমাদের কাস্টম error হ্যান্ডেলার ব্যবহার করবোঃ

set_error_handler("customError");

আমরা যেহেতু সকল ধরণের error হ্যান্ডেল করার জন্য উপরের কাস্টম ফাংশনটি ব্যবহার করতে চাচ্ছি, তাই কাস্টম error এর জন্য set_error_handler() ফাংশনে একটিমাত্র প্যারামিটার এর প্রয়োজন হবে।

এছাড়া আপনি যদি error এর লেভেলও নির্ধারণ করতে চান তাহলে দ্বিতীয় প্যারামিটার ব্যবহার করে error এর লেভেল নির্ধারণ করতে পারবেন।

উদাহরণ

নিম্নের উদাহরণে error হ্যান্ডেলার যাচাই করার জন্য আমরা অস্তিত্বহীন ভ্যারিয়েবলের আউটপুট নেওয়ার চেষ্টা করেছি।

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি error উদাহরণ</title>
</head>
<body>

<?php
//error handler function
function customError($err_level, $error_message ) {
  echo "<strong>Error:</strong> [$err_level] $error_message";
}

//error হ্যান্ডেলার সেট
set_error_handler("customError");

//error ট্রিগার
echo($test);
?>

</body>
</html>


ফলাফল
Error: [8] Undefined variable: test

Error ট্রিগার

যেসকল স্ক্রিপ্টের মধ্যে ব্যবহারকারী তথ্য ইনপুট করতে পারে, সেসকল ক্ষেত্রে ব্যবহারকারী কোনো অবৈধ তথ্য ইনপুট করতে চাইলে একটি error ট্রিগার করা খুবই সহায়ক। পিএইচপিতে trigger_error() ফাংশনের মাধ্যমে এটি সম্পাদিত হয়।

উদাহরণ

এই উদাহরণে যদি "test" ভ্যারিয়েবলের ভ্যালু "5" এর চেয়ে বেশি হয় তাহলে একটি error ঘটবেঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
$test=9;

if ($test>=5) {
  trigger_error("Value must be 5 or below");
}
?>

</body>
</html>

উপরের কোডটির আউটপুট নিম্নের মতো করে দেখাবেঃ

ফলাফল
Notice: Value must be 5 or below
in C:\wamp\www\test.php on line 6

আপনার ইচ্ছানুযায়ী একটি স্ক্রিপ্টের যেকোনো স্থানেই error ট্রিগার করতে পারেন এবং দ্বিতীয় প্যারামিটার যুক্ত করার মাধ্যমে কোন error লেভেলটি ট্রিগার হবে তাও নির্ধারণ করে দিতে পারেন।

সম্ভাব্য error টাইপসমূহঃ

  • E_USER_ERROR - ফ্যাটাল ব্যবহারকারী কর্তৃক রান-টাইম error। এই error থেকে পরবর্তীতে কোন কিছু পুনরুদ্ধার করা সম্ভব নয়। স্ক্রিপ্টের এক্সিকিউশন বন্ধ করে দিবে।
  • E_USER_WARNING - নন-ফ্যাটাল ব্যবহারকারী কর্তৃক রান-টাইম সতর্কতা। স্ক্রিপ্টের এক্সিকিউশন বন্ধ করবে না।
  • E_USER_NOTICE - ডিফল্ট। ব্যবহারকারী তৈরিকৃত রান-টাইম নোটিশ। স্বাভাবিকভাবে একটি রান করার সময় এমন কিছু খুজে পায় যা একটি error হতে পারে।

উদাহরণ

এই উদাহরণে যদি "test" ভ্যারিয়েবলের ভ্যালু "5" এর চেয়ে বেশি হয় তাহলে E_USER_WARNING error টি ঘটবে। যদি E_USER_WARNING error টি ঘটে সেক্ষেত্রে আমরা আমদের কাস্টম error হ্যান্ডেলারটি ব্যবহার করবো এবং স্ক্রিপ্টটি শেষ করবোঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
//error হ্যান্ডেলার ফাংশন
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

//error হ্যান্ডেলারটি সেট
set_error_handler("customError",E_USER_WARNING);

//error ট্রিগার
$test=9;
if ($test>=5) {
  trigger_error("Value must be 5 or below",E_USER_WARNING);
}
?>

</body>
</html>

উপরের কোডটির আউটপুট নিম্নের মতো করে দেখাবেঃ

ফলাফল
Error: [512] Value must be 5 or below
Ending Script

এতোক্ষন আমরা শিখেছি কিভাবে কাস্টম error তৈরি এবং তাদের ট্রিগার করতে হয়, চলুন এখন তাহলে error logging সম্পর্কে জানি।


Error Logging (লগিং)

ডিফল্টভাবে, পিএইচপি সার্ভারের লগিং সিস্টেমে অথবা একটি ফাইলে error log পাঠায়, যাহা php.ini ফাইলের error_log কনফিগারেশনের উপর নির্ভর করে। error_log() ফাংশনটি ব্যবহারের মাধ্যমে আপনি একটি নির্দিষ্ট ফাইলে অথবা নির্দিষ্ট গন্তব্যস্থলে error log পাঠাতে পারেন।

নির্দিষ্ট error সম্পর্কে অবগত হওয়ার জন্য error মেসেজগুলো আপনার ই-মেইলে পাঠানো একটি ভালো উপায়।


ই-মেইলের মাধ্যমে Error মেসেজ

নিচের উদাহরণে একটি নির্দিষ্ট error ঘটলে স্ক্রিপ্টটির শেষে ই-মেইলের মাধ্যমে একটি error মেসেজ পাঠানো হবেঃ

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
//error হ্যান্ডেলার ফাংশন
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Satt Academy has been notified";
  error_log("Error: [$errno] $errstr",5,
  "someone@example.com","From: satt_academy@example.com");
}

//error হ্যান্ডেলার সেট
set_error_handler("customError",E_USER_WARNING);

//error ট্রিগার
$test=9;
if ($test>=5) {
  trigger_error("Value must be 5 or below",E_USER_WARNING);
}
?>

</body>
</html>

উপরের কোডটির আউটপুট নিম্নের মতো করে দেখাবেঃ

ফলাফল
Error: [512] Value must be 5 or below
Satt Academy has been notified

উপরের কোডটি থেকে যে মেইলটি পাওয়া যাবে সেটি দেখতে নিম্নের মতো দেখাবেঃ

ফলাফল
Error: [512] Value must be 5 or below

এটি সকল error এর ক্ষেত্রে ব্যবহার করা উচিৎ নয়। রেগুলার error গুলো ডিফল্টভাবে সার্ভারে সংরক্ষন করা উচিত।


এক্সেপশন হ্যান্ডেলিং

প্রোগ্রামে কোনো নির্দিষ্ট error সংঘটিত হলে এক্সিকিউশন(execution)-র স্বাভাবিক ধারাকে পরিবর্তন করার জন্য এক্সেপশন(Exception) ব্যবহার করা হয়।


এক্সেপশন কি

কোড এক্সিকিউশনের সময় কোনো নির্দিষ্ট error বা ব্যতিক্রমধর্মী কন্ডিশনের সৃষ্টি হলে, কোড এক্সিকিউশন(execution)-র স্বাভাবিক ধারাকে পরিবর্তন করার জন্য এক্সেপশন(Exception) ব্যবহার করা হয়। এই কন্ডিশন(conditon)-কে এক্সেপশন বলা হয়।

পিএইচপি ৫ আসার পরে error নিয়ন্ত্রণে নতুন মাত্রা হিসাবে অবজেক্ট ওরিয়েন্টেড পদ্ধতি যোগ হয়েছে।


এক্সেপশনের উৎপত্তি হলে সাধারণত নিচের বিষয়সমূহ সংঘটিত হয়ঃ

  • সাম্প্রতিক কোডের ফিল্ড সংরক্ষিত হয়।
  • কোডের এক্সিকিউশন বর্তমান অবস্থা থেকে পূর্ব নির্ধারিত বা কাস্টম এক্সেপশন হ্যান্ডেলার ফাংশনের কাছে সুইচ করবে।
  • পরিস্থিতির উপর ভিত্তিকরে হ্যান্ডেলার সংরক্ষিত কোডের ফিল্ড থেকে এক্সিকিউশন চালু করতে পারে, স্ক্রিপ্ট এক্সিকিউশন শেষ করে দিতে পারে অথবা ভিন্ন লোকেশন থেকে স্ক্রিপ্ট চলমান রাখতে পারে।

এই অধ্যায়ে নিম্নোক্ত error হ্যান্ডেলিং মেথডসমূহ নিয়ে আলোচনা করবোঃ

  • এক্সেপশনের মৌলিক ব্যবহার
  • কাস্টম(custom) এক্সেপশন হ্যান্ডেলার তৈরি
  • মাল্টিপল(Multiple) এক্সেপশন
  • এক্সেপশনকে পুনরায় নিক্ষেপ(Re-throwing) করা
  • টপ লেভেলের এক্সেপশন হ্যান্ডেলার সেট করা

বিঃদ্রঃ শুধুমাত্র error কন্ডিশন নিয়ে কাজ করার জন্য এক্সেপশন ব্যবহার করা উচিৎ। কোনো নির্দিষ্ট পয়েন্টে এক স্থান থেকে অন্য স্থানে লাফ দিয়ে যাওয়ার জন্য এটি ব্যবহার করা উচিৎ নয়।


এক্সেপশনের মৌলিক ব্যবহার

যখন কোনো এক্সেপশন নিক্ষিপ্ত হয় তখন এটিতে যে কোড থাকে তা সম্পাদিত(executed) হয় না, এক্ষেত্রে পিএইচপি এর সাথে মিলসম্পন্ন ক্যাচ( "catch") ব্লককে খুঁজে বের করার চেষ্টা করে।

যদি কোনো এক্সেপশন ধরতে না পারে তাহলে Uncaught Exception ম্যাসেজের মাধ্যমে মারাত্মক ভুল(fatal error) প্রেরণ করবে।

এক্সেপশনকে নিক্ষেপ করে না ধরলে কি হয় তা উদাহরণের মাধ্যমে দেখা যাক।

উদাহরণ
<?php
//এক্সেপশনসহ একটি ফাংশন তৈরি করুন
function checkNumber($num) {
  if($num>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//এক্সেপশনকে ট্রিগার করুন
checkNumber(2);
?>


ফলাফল
( ! ) Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below'
( ! ) Exception: Value must be 1 or below

Try, throw এবং catch

আমরা যদি উপরের উদাহরণে error কে এড়িয়ে চলতে চাই তাহলে এক্সেপশন হ্যান্ডেল করার জন্য উপযুক্ত কোড লেখার প্রয়োজন হবে।

উওযুক্ত এক্সেপশন হ্যান্ডেলিং কোডে নিম্নোক্ত বিষয়সমূহ থাকেঃ

  • Try - এক্সেপশন ব্যবহার করে এমন ফাংশনকে "try" ব্লকের মধ্যে রাখতে হয়। যদি কোনো এক্সেপশন না থাকে তাহলে স্বাভাবিকভাবেই কোড সম্পাদিত হোয়বে। কিন্তু যদি এক্সেপশন থাকে তাহলে এটি নিক্ষিপ্ত("thrown") হয়।
  • Throw - এটির মাধ্যমে এক্সেপশন ছুড়ে ফেলা হয়। মনে রাখতে হবে প্রত্যেকটি থ্রো("throw") ব্লকের জন্য কমপক্ষে একটি ক্যাচ("catch") ব্লক থাকবে। অর্থাৎ কোনো কিছু ছুড়ে ফেলার পরে তা পূনরুদ্ধার করতে হবে অথবা ধরতে হবে।
  • ছুড়ে ফেলা এক্সেপশনকে Catch - ক্যাচ("catch") ব্লক পূনরুদ্ধার করে এবং এক্সেপশনের তথ্য সম্বলিত একটি অবজেক্ট তৈরি করে।

চলুন বৈধ্য কোড সম্বলিত এক্সেপশনকে ট্রিগার(trigger) করার চেষ্টা করিঃ

উদাহরণ
<?php
// এক্সেপশনের সহিত একটি ফাংশন তৈরি
function checkNumber($num) {
  if($num > 1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

// "try" ব্লকের মধ্যে এক্সেপশন নিক্ষিপ্ত হবে
try {
  checkNumber(2);
  // যদি এক্সেপশনটি নিক্ষিপ্ত হয়, তাহলে এই লিখাটি প্রদর্শিত হবে না
  echo "If you see this, the number is 1 or below";
}

// এক্সেপশনটি ক্যাচ করে
catch(Exception $obg) {
  echo 'Message: ' .$obg->getMessage();
}
?>


ফলাফল
Message: Value must be 1 or below

উপরের উদাহরণের ব্যাখ্যাঃ

উপরের কোড এক্সেপশন থ্রো করে এবং ধরেঃ

  • প্রথমে checkNumber() ফাংশনের সৃষ্টি হয়। এটি সংখ্যাটি ১ এর চেয়ে বড় কিনা তা চেক করে। যদি বড় হয় তাহলে এক্সেপশন থ্রো হয়।
  • "try" ব্লক থেকে checkNumber() ফাংশনকে কল করা হয়।
  • checkNumber() ফাংশনের মধ্যে এক্সেপশনকে ছুড়ে ফেলা হয়।
  • "catch" ব্লক ছুড়ে ফেলা এক্সেপশনকে তুলে আনে এবং এক্সেপশনের তথ্য নিয়ে একটি অবজেক্ট($obg) তৈরি করে
  • এক্সেপশন অবজেক্ট থেকে $obg->getMessage() কে কল করে এক্সেপশন থেকে error ম্যাসেজকে প্রিন্ট করা হয়।

যাইহোক, প্রত্যেক throw এর জন্য একটি catch থাকে এটি টপ লেভেল হ্যান্ডেলার সেট করে error হ্যান্ডেল করার জন্য।


একটি কাস্টম এক্সেপশন ক্লাস তৈরি

একটি কাস্টম এক্সেপশন হ্যান্ডেলার তৈরি করতে আপনাকে অবশ্যই একটি ফাংশন নিয়ে বিশেষ ক্লাস তৈরি করতে হবে আর যখনই পিএইচপিতে এক্সেপশন ঘটবে তখনই ঐ ফাংশনটি ডাকা হবে। ক্লাসটি অবশ্যই এক্সেপশন ক্লাসের এক্সটেনশন(extension) হতে হবে।

কাস্টম এক্সেপশন ক্লাস পিএইচপি এক্সেপশন ক্লাস থেকে প্রোপার্টি সমুহ ইনহেরিট করতে পারে এবং আপনি এটিতে কাস্টম ফাংশন যোগ করতে পারেন।

চলুন একটি এক্সেপশন ক্লাস তৈরি করা যাকঃ

উদাহরণ
<?php
class customException extends Exception {
  public function errorMessage() {
    // ত্রুটি মেসেজ
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-mail';
    return $errorMsg;
  }
}

$email = "someone@example...com";

try {
  // ই-মেইলটি সঠিক নাকি ভুল তা পরীক্ষা করছে
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    // ই-মেইলটি যদি বৈদ না হয় সেক্ষেত্রে এক্সেপশনটি নিক্ষিপ্ত হবে
    throw new customException($email);
  }
}

catch (customException $obg) {
  // কাস্টম মেসেজটি প্রদর্শিত হবে
  echo $obg->errorMessage();
}
?>

নতুন ক্লাসটি পুরাতন এক্সেপশন ক্লাসের অনুলিপি এর সাথে নতুন করে errorMessage() ফাংশনটি যুক্ত হয়েছে। যেহেতু নতুন ক্লাসটি পুরাতন ক্লাসের অনুলিপি এবং এটি পুরাতন ক্লাসেরই মেথোড এবং প্রোপার্টি সমুহ ইনহেরিট করছে, সুতরাং আমরা এক্সেপশন ক্লাসের মেথোড সমূহ এইভাবে ব্যবহার করতে পারিঃ- getLine()getFile() এবং getMessage()

উপরের উদাহরণের ব্যাখ্যাঃ

উপরের কোডটি একটি এক্সেপশন throws করছে এবং কাস্টম এক্সেপশন ক্লাস catches করছেঃ

  • customException() ক্লাসটি পুরানো এক্সেপশন ক্লাসের এক্সটেনশন হিসাবে তৈরি করা হয়। এই পদ্ধতিটি পুরানো এক্সেপশন ক্লাস থেকে সমস্ত মেথোড এবং প্রোপার্টি সমূহ ইনহেরিট করতে সক্ষম।
  • এই ক্লাসে errorMessage() ফাংশনটি তৈরি করা হয়েছে। এই ফাংশনটি একটি ত্রুটি মেসেজ ফেরত পাঠায় যদি কোনো ইমেলের ঠিকানা অবৈদ হয়।
  • যদি ইমেলের ঠিকানাটি ভুল হয় সেক্ষেত্রে $email ভেরিয়েবিলটি স্ট্রিং দ্বারা পূর্ণ করা হয়।
  • "try" ব্লকটি কার্যকর হয় এবং ই-মেইলের ঠিকানাটি অবৈদ হওয়ার কারনে একটি এক্সেপশন নিক্ষেপ করা হয়
  • "catch" ব্লকটি নিক্ষিপ্ত এক্সেপশনটি ধারন করে এবং ত্রুটি মেসেজটি প্রদর্শন করে।

একাধিক এক্সেপশন (exceptions)

একাধিক শর্ত পরীক্ষা করার জন্য স্ক্রিপ্টে একাধিক এক্সেপশন ব্যবহার করা সম্ভব।

কয়েকটি if..else ব্লক, একটি switch অথবা নেস্ট একাধিক এক্সেপশন ব্যবহার করা সম্ভব। এই সকল এক্সেপশন গুলো বিভিন্ন এক্সেপশন ক্লাস ব্যবহার করতে পারে এবং বিভিন্ন ত্রুটি মেসেজ রিটার্ন করেঃ

উদাহরণ
<?php
class customException extends Exception {
 public function errorMessage() {
   // ত্রুটি মেসেজ
   $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
   .': <b>'.$this->getMessage().'</b> is not a valid E-mail';
   return $errorMsg;
 }
}

$email = "someone@example.com";

try {
  // ই-মেইলটি সঠিক নাকি ভুল তা পরীক্ষা করছে
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    // ই-মেইলটি যদি বৈদ না হয় সেক্ষেত্রে এক্সেপশনটি নিক্ষিপ্ত হবে
    throw new customException($email);
  }
  // ই-মেইলের ঠিকানায় "example" লিখাটি বিদ্যমান কিনা তা পরীক্ষা করছে
  if(strpos($email, "example") !== FALSE) {
    throw new Exception("$email is an example e-mail");
  }
}

catch (customException $obg) {
  echo $obg->errorMessage();
}

catch(Exception $obg) {
  echo $obg->getMessage();
}
?>

উপরের উদাহরণের ব্যাখ্যাঃ

উপরের কোডটি দুইটি শর্ত পরীক্ষা করে এবং যদি একটিও শর্ত সত্যি না হয় সেক্ষেত্রে একটি এক্সেপশন throws করেঃ

  • customException() ক্লাসটি পুরানো এক্সেপশন ক্লাসের এক্সটেনশন হিসাবে তৈরি করা হয়। এই পদ্ধতিটি পুরানো এক্সেপশন ক্লাস থেকে সমস্ত মেথোড এবং প্রোপার্টি সমূহ ইনহেরিট করতে সক্ষম।
  • এই ক্লাসে errorMessage() ফাংশনটি তৈরি করা হয়েছে। এই ফাংশনটি একটি ত্রুটি মেসেজ ফেরত পাঠায় যদি কোনো ইমেলের ঠিকানা অবৈদ হয়।
  • $email ভ্যারিয়েবলটি একটি বৈধ ই-মেইল ঠিকানা হয় তবে এটি স্ট্রিং আকারে ধারন করে এবং ই-মেইলের ঠিকানায় "example" লিখাটি উল্লেখ রয়েছে।
  • "try" ব্লকটি কার্য-সম্পাদন করে কিন্তু প্রথম শর্তটি কোনো এক্সেপশন নিক্ষেপ করে না।
  • ই-মেইলের ঠিকানার মধ্যে "example" লিখাটি উল্লেখ থাকায় দ্বিতীয় শর্তটি সত্য হয় এবং একটি এক্সেপশন নিক্ষেপ করে।
  • "catch" ব্লকটি নিক্ষিপ্ত এক্সেপশনটি ধারন করে এবং ত্রুটি মেসেজটি প্রদর্শন করে।

যদি এক্সেপশনটি customException ক্লাসের মাধ্যমে নিক্ষেপ করা হতো এবং সেখানে ক্যাচ করার মত কোনো customException থাকতো না, সেক্ষেত্রে শুধুমাত্র বেস এক্সেপশনটি ক্যাচ করতো এবং এই এক্সেপশোনটি সেখানে হ্যান্ডেল করা হতো।


পুনরায় নিক্ষিপ্ত এক্সেপশন

কখনও কখনও, যখন একটি এক্সেপশন নিক্ষিপ্ত হয়, তখন আপনি ইচ্ছা করলে এর চিরাচরিত উপায় ব্যাতিত ভিন্ন উপায়ে এটিকে হ্যান্ডেল করতে পারেন। একটি "catch" ব্লকের মধ্যে একটি এক্সেপশনকে দ্বিতীয়বার নিক্ষেপ করা সম্ভব।

একটি স্ক্রিপ্ট সিস্টেমের ত্রুটি গুলো ব্যবহারকারীর কাছ থেকে লুকিয়ে ফেলে। একজন কোডারের জন্য সিস্টেমের ত্রুটি গুলো অনেক গুরুত্বপুর্ণ হতে পারে, কিন্তু একজন ব্যবহারকারীর কাছে সিস্টেমের ত্রুটি গুলো বিরক্তিকর মনে হতে পারে। সুতরাং, ব্যবহারকারীর জন্য জিনিসগুলো আরো সহজতর করার জন্য এক্সেপশন গুলোকে পুনরায় দ্বিতীয়বার ব্যবহারকারীর উপযুক্ত মেসেজ সহকারে নিক্ষেপ করা হয়ঃ

উদাহরণ
<?php
class customException extends Exception {
  public function errorMessage() {
    // ত্রুটি মেসেজ
    $errorMsg = $this->getMessage()." is not a valid E-mail.";
    return $errorMsg;
  }
}

$email = "someone@example.com";

try {
  try {
    // ই-মেইলের ঠিকানায় "example" লিখাটি বিদ্যমান কিনা তা পরীক্ষা করছে
    if(strpos($email, "example") !== FALSE) {
      // ই-মেইলটি যদি বৈদ না হয় সেক্ষেত্রে এক্সেপশনটি নিক্ষিপ্ত হবে
      throw new Exception($email);
    }
  }
  catch(Exception $obg) {
    // পুনরায় নিক্ষিপ্ত এক্সেপশন
    throw new customException($email);
  }
}

catch (customException $obg) {
  // কাস্টম মেসেজটি প্রদর্শিত হবে
  echo $obg->errorMessage();
}
?>

উপরের উদাহরণের ব্যাখ্যাঃ

উপরের কোডে ই-মেইলের ঠিকানা পরীক্ষা করা হয় এবং যদি ই-মেইলের ঠিকানার মধ্যে "example" লিখাটি উল্লেখ থাকে, সেক্ষেত্রে এক্সেপশনটি আবার পুনরায় নিক্ষেপ করা হয়ঃ

  • customException() ক্লাসটি পুরানো এক্সেপশন ক্লাসের এক্সটেনশন হিসাবে তৈরি করা হয়। এই পদ্ধতিটি পুরানো এক্সেপশন ক্লাস থেকে সমস্ত মেথোড এবং প্রোপার্টি সমূহ ইনহেরিট করতে সক্ষম।
  • এই ক্লাসে errorMessage() ফাংশনটি তৈরি করা হয়েছে। এই ফাংশনটি একটি ত্রুটি মেসেজ ফেরত পাঠায় যদি কোনো ইমেলের ঠিকানা অবৈদ হয়।
  • $email ভ্যারিয়েবলটি একটি বৈধ ই-মেইল ঠিকানা হয় তবে এটি স্ট্রিং আকারে ধারন করে এবং ই-মেইলের ঠিকানায় "example" লিখাটি উল্লেখ রয়েছে।
  • "try" ব্লকটির মধ্যে আরো একটি "try" ব্লক বিদ্যমান থাকে, যেন এক্সেপশনকে পুনরায় নিক্ষেপ করা সম্ভব হয়।
  • যখনই ই-মেইলের মধ্যে "example" লিখাটি উল্লেখ থাকবে, তখনই এক্সেপশনটি নিক্ষেপ করা হবে।
  • "catch" ব্লকটি একটি এক্সেপশন ধরবে এবং পুনরায় একটি "customException" নিক্ষেপ করবে।
  • অন্য একটি "catch" ব্লক "customException" কে ক্যাচ করবে এবং ত্রুটি মেসেজটি প্রদর্শন করবে।

যদি এক্সেপশনটি তার বর্তমান "try" ব্লকে কোনো "catch" খুঁজে না পায়, সেক্ষেত্রে এটি বর্তমান "try" ব্লকে উপরের স্তরে "catch" ব্লক খুঁজে।


উপরের স্তরের এক্সেপশন হ্যান্ডেলার সেট করুন

set_exception_handler() ফাংশনটি ব্যবহারকারী কর্তৃক ডিফাইনকৃত ফাংশন যা, যে সকল এক্সেপশন গুলো ক্যাচ করা হয়না তাদের হ্যান্ডেল করেঃ

উদাহরণ
<?php
function ownException($obgxception) {
 echo "<b>Exception:</b> " . $obgxception->getMessage();
}

set_exception_handler('ownException');

throw new Exception('Non Catchable Exception occurred');
?>


ফলাফল
Message: Non Catchable Exception occurred

উপরের কোডটিতে কোনো "catch" ব্লক নেই। এর পরিবর্তে উপরের স্তরে ফাংশনটি কাজ করা চালু করে, যা ক্যাচ না হওয়া এক্সেপশন গুলো হ্যান্ডেল করে।


এক্সেপশনের জন্য নিয়মাবলী

  • সম্ভাব্য এক্সেপশন গুলো ধরতে সাহায্য করার জন্য কোডগুলো "try" ব্লক দ্বারা বেষ্টিত থাকতে পারে।
  • প্রতিটি "try" ব্লক অথবা "throw" এর জন্য অবশ্যই একটি "catch" ব্লক থাকে।
  • বিভিন্ন ক্লাসের এক্সেপশন গুলো ধরার জন্য একাধিক "catch" ব্লক ব্যবহার করা যেতে পারে।
  • "try" ব্লকে একটি "catch" ব্লকের মধ্যে এক্সেপশন গুলো নিক্ষেপ অথবা পুনরায় নিক্ষেপ করা যেতে পারে।

একটি সাধারন নিয়মঃ যদি আপনি কিছু নিক্ষেপ করেন, আপনাকে তা ধরতেই হবে।