PHP Exception হ্যান্ডলিং

অসুবিধা (Exception) - নির্দিষ্ট ত্রুটির ঘটার সময় স্ক্রিপ্টের সাধারণ পথকে পরিবর্তন করা হয়

অসুবিধা (Exception) - নির্দিষ্ট ত্রুটির ঘটার সময় স্ক্রিপ্টের সাধারণ পথকে পরিবর্তন করা হয়

কী অসুবিধা?

PHP 5-এ একটি নতুন ওয়ার্কসপেস-ভিত্তিক ত্রুটি প্রক্রিয়াকরণ পদ্ধতি প্রদান করে。

অসুবিধা প্রক্রিয়াকরণ ব্যবহৃত হয় যখন নির্দিষ্ট ত্রুটি (অসুবিধা) ঘটে এবং স্ক্রিপ্টের সাধারণ পথকে পরিবর্তন করা হয়। এই পরিস্থিতির নাম "অসুবিধা"

  • যখন অসুবিধা ট্রিগার করা হয়, সাধারণত এমন ঘটবে:
  • কোড চলাকালীন স্থিতি সংরক্ষিত হবে
  • পরিস্থিতির উপর নির্ভর করে, হ্যান্ডলার সংরক্ষিত কোড থেকে পুনরায় কোড চলাকালীন কোড চালাতে পারে, স্ক্রিপ্ট চালনা সমাপ্ত করতে পারে বা কোডের অন্য স্থান থেকে কোড চালাতে পারে

আমরা ভিন্ন ভিন্ন ত্রুটি প্রক্রিয়াকরণ পদ্ধতি দেখাব:

  • অসুবিধার মৌলিক ব্যবহার
  • স্বনির্মিত অসুবিধা হ্যান্ডলার তৈরি করুন
  • একাধিক exception
  • নিষ্ক্রিয়করণ পুনরায় প্রক্রিয়াকরণ
  • শীর্ষস্থানীয় অসুবিধা হ্যান্ডলার সেট করুন

অসুবিধার মৌলিক ব্যবহার

যখন অসুবিধা ফেলা হয়, তখন তারপরের কোড চলতে থাকবে না, PHP একটি ম্যাচিং "catch" কোড ব্লক অনুসন্ধান করবে。

যদি অসুবিধা কোনও ক্যাচ না করা হয় এবং set_exception_handler() ব্যবহার করা হয়না, তবে একটি গুরুতর ত্রুটি (ফ্যাটাল এররর) ঘটবে, এবং "Uncaught Exception" (অপকৃত অসুবিধা) বার্তা প্রদর্শিত হবে。

আমরা একটি অসুবিধা ফেলার চেষ্টা করি, যেটা কোনও ক্যাচ না করা:

<?php
// অসুবিধা ফাংশন তৈরি করুন
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }
// অসুবিধা ট্রিগার করুন
checkNum(2);
?>

এই কোড এমনভাবে একটি ত্রুটি পাবে:

ফ্যাটাল এররর: অপকৃত অসুবিধা 'Exception' 
বার্তা 'Value must be 1 or below' সহ C:\webfolder\test.php:6-তে 
স্ট্যাক ট্রেস: #0 C:\webfolder\test.php(12): 
checkNum(28) #1 {main} সম্পাদনা C:\webfolder\test.php-তে line 6-এ ফেলা

Try, throw এবং catch

উপরের উদাহরণে ঘটা ত্রুটিটি এড়াতে, আমাদের অসুবিধা প্রক্রিয়াকরণের উপযুক্ত কোড তৈরি করতে হবে。

সঠিক হ্যান্ডলার উচিত হল:

  1. চেষ্টা - অসুবিধার ফাংশনটি "try" কোড ব্লকের মধ্যে থাকা উচিত। যদি কোনও অসুবিধা ঘটবে না, তবে কোড সাধারণভাবে চলতে থাকবে। কিন্তু যদি অসুবিধা ঘটে, তবে একটি অসুবিধা ফেলে দেওয়া হবে。
  2. Throw - Here is defined how to trigger an exception. Every "throw" must have at least one "catch"
  3. Catch - "catch" block will catch the exception and create an object containing exception information

Let's trigger an exception:

<?php
//Create a function that can throw an exception
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }
//In the "try" block, trigger an exception
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
catch(Exception $e)
 {
 echo 'Message: ' .$e->getMessage();
 }
?>

এই কোড একটি এমন ত্রুটি পাওয়া যাবে

Message: Value must be 1 or below

উদাহরণ ব্যাখ্যা:

এই কোড একটি exception ফেলে, এবং তা ধরে নিয়ে গ্রহণ করে

  1. checkNum() ফাংশন তৈরি করুন।এটি সংখ্যা 1-এর উপরে কি নয় এই কথা পরীক্ষা করে, যদি তবে, একটি exception ফেলে
  2. "try" কোড ব্লকে চেকনাম() ফাংশন বলা হয়
  3. checkNum() ফাংশনের exception ফেলা হয়
  4. "catch" কোড ব্লকটি এই exception-কে গ্রহণ করে, এবং একটি exception তথ্য সম্পর্কিত object ($e) তৈরি করে
  5. এই exception অবজেক্ট $e->getMessage() থেকে কোড বিশেষ বিষয় সম্পর্কে তুলে ধরা যাবে

তবে, "প্রত্যেক throw-এর একটি catch-এর প্রয়োজন" নীতিটি মেনে চলতে, একটি উচ্চতর exception হ্যান্ডলার সমাধান করার জন্য সমাধান করা যেতে পারে।

একটি নিজস্ব Exception ক্লাস তৈরি করুন

একটি নিজস্ব exception হ্যান্ডলার তৈরি করা অত্যন্ত সহজ।আমরা একটি বিশেষ ক্লাস তৈরি করি, যা PHP-এর exception হ্যান্ডলার হিসাবে কাজ করে, যখন exception ঘটে, তখন তার ফাংশন বলা যাবে।এই ক্লাস exception ক্লাসের একটি সম্প্রসারণ হবে।

এই পারস্পরিক exception ক্লাস PHP-এর exception ক্লাসের সব লক্ষণকে উত্তরণ করে, আপনি তাকে নিজস্ব ফাংশন যোগ করতে পারেন。

আমরা একটি exception ক্লাস তৈরি করব করি:

<?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 address;
  return $errorMsg;
  }
 }
$email = "someone@example...com";
try
 {
 //check if 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  // ইমেইল বৈধ না হলে অসম্ভবতা ফেলা
  throw new customException($email);
  }
 }
catch (customException $e)
 {
 // কাস্টম সংবাদ দেখানো
 echo $e->errorMessage();
 }
?>

এই নতুন ক্লাসটি পুরনো exception ক্লাসের প্রতিলিপি, errorMessage() ফাংশন সহ, এবং এটি পুরনো ক্লাসের প্রতিলিপি হওয়ার কারণে, এটি পুরনো ক্লাস থেকে বৈশিষ্ট্য ও পদ্ধতি উত্তরসূরী করে, এবং আমরা exception ক্লাসের পদ্ধতি যেমন getLine(), getFile(), getMessage() ব্যবহার করতে পারি।

উদাহরণ ব্যাখ্যা:

উপরোক্ত কোডব্লক একটি নিষ্ক্রিয়করণ প্রক্রিয়াকরণ করে, এবং একটি পরিবর্তিত exception ক্লাসের মাধ্যমে তা ক্যাপচার করে:

  1. customException() শ্রেণী customException() শ্রেণীর একটি বিস্তার হিসাবে তৈরি করা হয়েছে। এই তার পূর্বসূরীর সকল গুণ ও পদ্ধতি উত্তরসূরী হয়েছে。
  2. errorMessage() ফাংশন তৈরি করা হবে। e-mail ঠিকানা অবৈধ হলে, এই ফাংশন একটি ত্রুটি সংবাদ প্রদান করবে
  3. $email বদল অবৈধ e-mail ঠিকানা শব্দটি হিসাবে সংজ্ঞায়িত করা হবে
  4. try" কোডব্লক প্রক্রিয়াকরণ করা হয়, e-mail ঠিকানা অবৈধ হওয়ার কারণে একটি নিষ্ক্রিয়করণ প্রক্রিয়াকরণ করা হবে
  5. "catch" কোডব্লক নিষ্ক্রিয়করণকে ক্যাপচার করে, এবং ত্রুটি সংবাদ দেখাবে

একাধিক exception

একটি স্ক্রিপ্টকে একাধিক exception-কে ব্যবহার করে, একাধিক পরিস্থিতি পরীক্ষা করা যেতে পারে。

একাধিক if..else কোডব্লক, বা একটি switch কোডব্লক, বা বহুবার নিষ্ক্রিয়করণকে ঘুর্ণায়মান করা যেতে পারে। এই নিষ্ক্রিয়করণগুলি বিভিন্ন exception ক্লাস ব্যবহার করে, এবং ভিন্ন ত্রুটি সংবাদ প্রদান করে:

<?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 address;
return $errorMsg;
}
}
$email = "someone@example.com";
try
 {
 //check if 
 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 $e)
 {
 echo $e->errorMessage();
 }
catch(Exception $e)
 {
 echo $e->getMessage();
 }
?>

উদাহরণ ব্যাখ্যা:

উপরোক্ত কোডব্লক দুইটি শর্তকে পরীক্ষা করে, যদি কোনও শর্তই পূর্তি না হয়, তবে একটি নিষ্ক্রিয়করণ প্রক্রিয়াকরণ করা হবে:

  1. customException() শ্রেণী customException() শ্রেণীর একটি বিস্তার হিসাবে তৈরি করা হয়েছে। এই তার পূর্বসূরীর সকল গুণ ও পদ্ধতি উত্তরসূরী হয়েছে。
  2. errorMessage() ফাংশন তৈরি করা হয়েছে। e-mail ঠিকানা বৈধ না হলে, এই ফাংশন একটি ত্রুটি সংবাদ ফিরিয়ে দেয়。
  3. "try" কোডব্লক প্রক্রিয়াকরণ করা হয়, প্রথমটির শর্তটি পূর্তি হলে, নিষ্ক্রিয়করণ প্রক্রিয়াকরণ করা হবে না。
  4. যদি e-mail-এ "example" শব্দটি থাকে, তবে দ্বিতীয়টি শর্তটি নিষ্ক্রিয়করণ সংঘটিত করবে。
  5. "catch" কোডব্লক নিষ্ক্রিয়করণকে ক্যাপচার করে, এবং সঠিক ত্রুটি সংবাদ দেখাবে

যদি customException-কে অবশ্যই ক্যাপচার করা হয়নি, তবে base exception-কে ক্যাপচার করা হয়, তবে সেখানে নিষ্ক্রিয়করণ প্রক্রিয়াকরণ করা হবে。

নিষ্ক্রিয়করণ পুনরায় প্রক্রিয়াকরণ

কখনও অস্বাভাবিক নিষ্ক্রিয়করণ হলে, আপনি স্ট্যান্ডার্ড পদ্ধতিতে ভিন্নভাবে তা এবং প্রক্রিয়াকরণ করতে চান। একটি "catch" কোডব্লকে আবার নিষ্ক্রিয়করণ প্রক্রিয়াকরণ করা যেতে পারে。

শ্রোতা কেন্দ্রিক ভাবে, সিস্টেম ত্রুটিকে হৃদয়কর হতে হবে। প্রোগ্রামার কাছে, সিস্টেম ত্রুটি গুরুত্বপূর্ণ হতে পারে, কিন্তু শ্রোতারা তাদের সম্মুখীন হতে চায় না। শ্রোতাকে সহজভাবে ব্যবহার করতে, আপনি পুনরায় ফেলা যেতে পারেন একটি অসম্ভবতা, যা শ্রোতাকে বোঝানোর জন্য সুবিধাজনক সংবাদ সম্পর্কে:

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  // ত্রুটি সংবাদ
  $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
  return $errorMsg;
  }
 }
$email = "someone@example.com";
try
 {
 try
  {
  // "example" ইমেইল ঠিকানায় পরীক্ষা করা
  if(strpos($email, "example") !== FALSE)
   {
   // ইমেইল বৈধ না হলে অসম্ভবতা ফেলা
   throw new Exception($email);
   }
  }
 catch(Exception $e)
  {
  // অসম্ভবতা পুনরায় ফেলা
  throw new customException($email);
  }
 }
catch (customException $e)
 {
 // কাস্টম সংবাদ দেখানো
 echo $e->errorMessage();
 }
?>

উদাহরণ ব্যাখ্যা:

উপরের কোড ইমেইল ঠিকানায় "example" শব্দ থাকাকে পরীক্ষা করে, যদি থাকলে, তবে অসম্ভবতা পুনরায় ফেলা হয়:

  1. customException() শ্রেণী customException() শ্রেণীর একটি বিস্তার হিসাবে তৈরি করা হয়েছে। এই তার পূর্বসূরীর সকল গুণ ও পদ্ধতি উত্তরসূরী হয়েছে。
  2. errorMessage() ফাংশন তৈরি করা হয়েছে। e-mail ঠিকানা বৈধ না হলে, এই ফাংশন একটি ত্রুটি সংবাদ ফিরিয়ে দেয়。
  3. $email বদলে $email একটি বৈধ ইমেইল ঠিকানা সম্পূর্ণ করা হয়, কিন্তু এতে "example" শব্দ থাকে。
  4. try কোড ব্লকে আরও একটি try কোড ব্লক থাকে, যাতে অসম্ভবতা পুনরায় ফেলা যায়。
  5. e-mail-এ "example" শব্দ থাকায়, তাই অসম্ভবতা সংঘটিত হয়েছে。
  6. catch এই অসম্ভবতা পাওয়া গেছে এবং customException পুনরায় ফেলা হয়েছে。
  7. customException পাওয়া গেছে এবং একটি ত্রুটি সংবাদ দেখানো হয়েছে。

If an exception is not caught in the current 'try' code block, it will look for a catch block at a higher level.

Set Top-Level Exception Handler

The set_exception_handler() function can set a user-defined function to handle all uncaught exceptions.

<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>

The output of the above code should be similar to this:

Exception: Uncaught Exception occurred

In the above code, there is no 'catch' block, but the top-level exception handling program is triggered. This function should be used to catch all uncaught exceptions.

Rules of Exceptions

  • Code that needs to handle exceptions should be placed inside a try block to catch potential exceptions.
  • Each try or throw block must have at least one corresponding catch block.
  • Multiple catch blocks can be used to catch different types of exceptions.
  • Exceptions can be re-thrown (re-thrown) within the catch block of the try code block.

In short: If an exception is thrown, it must be caught.