آموزش PHP

آموزش پیشرفته PHP - مدیریت خطا و استثنا

مدیریت خطا روند گرفتن خطا توسط برنامه شما و سپس انجام اقدامات مناسب است. اگر مدیریت خطا درست انجام شود، ممکن است منجر به عواقب پیش بینی نشده بسیاری شود.

مدیریت خطا در PHP بسیار ساده است.

استفاده از تابع ()die

هنگام نوشتن برنامه PHP و پیش از رفتن به مراحل بعدی باید شرایط خطای احتمالی را چک کنید و در صورت لزوم اقدامات مناسب را انجام نمایید.

مثال زیر را یک دور بدون داشتن فایل  /tmp/test.xt و یک دور با این فایل امتحان کنید.

<?php
   if(!file_exists("/tmp/test.txt")) {
      die("File not found");
   }else {
      $file = fopen("/tmp/test.txt","r");
      print "Opend file sucessfully";
   }
   // Test of the code here.
?>

به این ترتیب می توانید یک کد کارآمد بنویسید. با استفاده از تکنیک بالا می توانید هر زمان که اشتباه می کنید برنامه خود را متوقف کرده و پیام های معنی دار و کاربر پسند را نمایش دهید.

تعریف تابع سفارشی مدیریت خطا

می توانید تابع خود را برای رسیدگی به هر گونه خطا بنویسید. PHP یک چارچوب برای تعریف تابع جهت مدیریت خطا را فراهم می کند.

این تابع باید بتواند حداقل دو پارامتر (error level (سطح خطا) و error message (پیام خطا)) را مدیریت کند، اما می تواند تا پنج پارامتر ( اختیاری:  file، line number و error context) را نیز قبول کند.

دستورنگارش (syntax)

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

 

پارامتر شرح
error_level

ضروری، سطح گزارش خطا را برای خطای تعریف شده توسط کاربر تعیین می کند. مقدار آن باید عدد باشد.

error_message

ضروری، پیام خطا را برای خطای تعریف شده توسط کاربر مشخص می کند.

error_file

اختیاری، نام فایل را که در آن خطا اتفاق افتاده تعیین می کند.

error_line

اختیاری، شماره خط را که در آن خطایی رخ داده است مشخص می کند.

error_context

اختیاری، مشخص کننده یک آرایه حاوی هر متغیر و مقادیر آنها در هنگام استفاده از  رخ دادن خطا رخ است.

 

سطوح امکان پذیر خطا

سطوح گزارش خطا انواع مختلفی از خطا است که می توان آن را برای پردازنده خطای تعریف شده توسط کاربر استفاده کرد. این مقدار Cab استفاده شده در ترکیب با استفاده از عملگر | می باشد.

constant شرح مقدار
.E_ERROR

اشتباهات  مهلک یا Fatal در زمان اجرا. اجرای اسکریپت متوقف شده است.

1

E_WARNING

اشتباهات غیرقطعی یا Non-fatal در زمان اجرا ، اجرای اسکریپت متوقف نشده است.

2

E_PARSE

خطاهای تجزیه و تحلیل زمان کامپایل (Compile-time parse errors)، خطاهای تجزیه فقط باید توسط parser تولید شود.

4

E_NOTICE

اطلاعیه های زمان اجرای اسکریپت چیزی را پیدا کرد که ممکن است خطا باشد، اما می تواند هنگام اجرای یک اسکریپت به طور معمول رخ دهد.

8

E_CORE_ERROR

خطاهای Fatal که در ابتدای راه اندازی PHP اتفاق می افتد.

16

E_CORE_WARNING

اشتباهات غیرقطعی یا Non-fatal در زمان اجرا، این اتفاق در ابتدای راه اندازی PHP می افتد.

 

32

E_USER_ERROR

خطای Fatal تولید شده توسط کاربر، مانند E_ERROR است که برنامه نویس با استفاده از تابع ()trigger_error آن را تنظیم نموده است.

256

E_USER_WARNING

خطای Non-fatal تولید شده توسط کاربر، مانند E_WARNING است که برنامه نویس با استفاده از تابع ()trigger_error آن را تنظیم نموده است.

512

E_USER_NOTICE

اطلاعیه تولید شده توسط کاربر، مانند E_NOTICE است که برنامه نویس با استفاده از تابع ()trigger_error آن را تنظیم نموده است.

1024

E_STRICT

اطلاعیه های زمان اجرا فعال کردن تغییرات پیشنهادی PHP  در کد شما را نشان می دهد که بهترین قابلیت هماهنگی و سازگاری از کد شما را تضمین می کند.

2048

E_RECOVERABLE_ERROR

خطای fatal قابل انجام است این مانند E_ERROR است اما می تواند توسط یک دسته تعریف شده توسط کاربر گرفته شود ( ()set_error_handler را نیز ببینید)

4096

E_ALL

تمام خطاها و هشدارها، به جز سطح   E_STRICT E_STRICT) بخشی از E_ALL از PHP 6.0 خواهد بود)

8191

تمام سطوح خطای فوق را می توان با استفاده از تابع PHP   ساخته شده در کتابخانه که در آن سطح cab هر کدام از مقادیر تعریف شده در جدول بالا تعیین می شود را تنظیم نمود.

int error_reporting ( [int $level] )

در ادامه نحوه ایجاد تابع  error handling (دیریت خطا) وجود دارد:

<?php
   function handleError($errno, $errstr,$error_file,$error_line) {
      echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
      echo "<br />";
      echo "Terminating PHP Script";
      
      die();
   }
?>

هنگامی که شما دسته بندی خطای سفارشی خود را تعریف می کنید، باید آن را با استفاده از تابع set_error_handler کتابخانه PHP   تنظیم کنید. حالا اجازه دهید نمونه را با فراخوانی یک تابع که وجود ندارد بررسی کنیم.

<?php
   error_reporting( E_ERROR );
   
   function handleError($errno, $errstr,$error_file,$error_line) {
      echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
      echo "<br />";
      echo "Terminating PHP Script";
      
      die();
   }
   
   //set error handler
   set_error_handler("handleError");
   
   //trigger error
   myFunction();
?>

Exceptions Handling

PHP 5 یک مدل exception  شبیه به زبان های دیگر برنامه نویسی دارد. استثنائات مهم هستند و کنترل بیشتری بر رفتار خطا ارائه می دهند.

 کلمات کلیدی جدید مرتبط با exception ها به شرح زیر اند:

  • Try: یک تابع با استفاده از یک exception در بلوک « try» است. اگر exception عمل نکند، کد به صورت طبیعی ادامه خواهد یافت. با این حال اگر exception راه اندازی شود، exception " thrown" می شود.
  • Throw: این است که چگونه شما یک استثنا یل exception  را راه اندازی می کنید. هر " throw" باید حداقل یک " catch" داشته باشد.
  • Catch: یک بلوک "catch" یک استثناء را بازیابی می کند و یک شیء حاوی اطلاعات exception را ایجاد می نماید.

 هنگامی که یک استثنا thrown می شود، دستورات کد زیر اجرا نخواهد شد و PHP تلاش خواهد کرد اولین بلوک catch  منطبق را پیدا کند.

اگر یک استثنا نباشد، یک خطای Fatal با " Uncaught Exception ..." صادر می شود ...

  • یک استثنا می تواند thrown شود و در PHP (catched) شود. کد ممکن است در یک بلوک try  احاطه شود. 
  • هر try  باید حداقل یک بلوک مربوطه را داشته باشد. بلوک catch چندگانه می تواند برای گرفتن دسته های مختلف استثنا استفاده شود.
  • استثنا ها را می توان در یک بلوک catch ، thrown (یا re-thrown) کرد.

  مثال

در زیر قطعه کد، copy  و paste  این کد در یک فایل  را انجام داده و سپس نتیجه را بررسی می کند.

<?php
   try {
      $error = 'Always throw this error';
      throw new Exception($error);
      
      // Code following an exception is not executed.
      echo 'Never executed';
   }catch (Exception $e) {
      echo 'Caught exception: ',  $e->getMessage(), "n";
   }
   
   // Continue execution
   echo 'Hello World';
?>

در مثال فوق $e->getMessage برای دریافت پیام خطا استفاده می شود. توابع زیر می توانند از کلاس Exception استفاده کنند.

  • ()getMessage: پیام exception
  • ()getCode: کد exception 
  • ()getFile: نام فایل منبع 
  • ()getLine: خط منبع
  • ()getTrace: آرایه n از ()backtrace
  • ()getTraceAsString: رشته فرمت از trace

ایجاد handler exception  سفارشی

می توانید  handler exception سفارشی خود را تعریف کنید. از تابع زیر استفاده کنید تا تابع exception handler تعریف شده توسط کاربر تنظیم شود.

string set_exception_handler ( callback $exception_handler )

در اینجا exception_handler تابعی است که وقتی یک استثناء رخ می دهد، فراخوانی می شود. قبل از فراخوانی این تابع ()set_exception_handler باید تعریف شود.

مثال

<?php
   function exception_handler($exception) {
      echo "Uncaught exception: " , $exception->getMessage(), "n";
   }
	
   set_exception_handler('exception_handler');
   throw new Exception('Uncaught Exception');
   
   echo "Not Executedn";
?>

مجموعه توابع error handling را در توابع مدیریت خطا در PHP بررسی کنید.

در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش PHP

Learn PHP

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

کلیک کنید و سوالات خود را از ما بپرسید
لطفا فرم سوال را پر کنید

سوال شما با موفقیت ثبت شد. برای اینکه بتوانیم به شما اطلاع رسانی کنیم، موارد زیر را وارد کنید:

لطفا چند لحظه منتظر بمانید ...