مدیریت خطا در php یا همان Exception Handling در php که با دستور try catch انجام می شود , یک از موارد مهم اپلیکیشن های تحت وب است.برای آشنایی با انواع خطاها در php کلیک کنید
php نیز همانند زبان های برنامه نویسی دیگر مثل سی شارپ یک روش فوق العاده جذاب برای اداره کردن خطاها ارائه نموده است و آنهم استثنا یا Exception نام دارد .
در php عملیات try-catch معمولا با استفاده از بلاک try و catch پیاده سازی می شود که خب در بعضی مواقع به این بلاک بخش دیگری به نام finally اضافه می کنیم که بعد از اتمام بلاک try-catch کد های مربوط به final یا همان نهایی سازی اجرا می شود .
بلاک try شامل کدهایی است که به همراه قابلیت مدیریت خطا توسط php اجرا می شود و در صورت وجود هر خطا , توسط بلاک catch در php دریافت می شود .
برای هر یک از بلاک های try در اسکریپت php , باید حداقل یک بلاک catch وحود داشته باشد. می توانیم چندین بلاک catch نیز برای یک try به منظور مدیریت انواع exception ها در php داشته باشیم .
سینتکس try catch در php
کد php زیر به شما نحوه مدیریت خطا در php با try و catch را نشان میدهد .
1 2 3 4 5 6 7 8 |
<?php try{ // any code throws exception } catch(Exception $e) { //code to print caught exception } ?> |
مثال ساده php برای try – catch
یک مثال ساده از نحوه مدیریت خطا در php با try و catch را می بینیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php try{ $get_vars = count($_GET); if($get_vars!=0) { foreach($_GET as $key=>$value) { echo $key . " = " . $value . "<br/>"; } } else { throw new Exception("PHP GET global array is empty"); } } catch(Exception $e) { echo $e->getMessage(); } ?> |
در کد php بالا , بلاک try سعی می کند که طول آرایه گلوبال متغییر $_GET را برای چاپ هر یک از خانه های این آرایه بررسی کند .
اگر مقدار آرایه $_GET صفر باشد , یک استثنا را به اصطلاح پرتاب (throw
) می کند. حلقه و دستور throw توسط if –else
های بخش try مدیریت می شوند.
استفاده چندگانه از catch
همانطور که بخش اول مقاله مدیریت خطا در php با try catch اشاره کردیم , catch
های چندگانه برای یک بلاک try
در php برای مدیریت اولویت بندی استثنا ها به کار میرود .
برای مثال , کتابخانه php کلاس های جداگانه های به عنوان LogicException در ختیار ما قرار می دهد .
کد php زیر شامل چندین بلاک شرط پرتاپ برای استثناهای مختلف php است . برای مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php $time_param1 = array(1,2,3,"four",5,6); try{ $timestamp1 = get_timestamp($time_param1); print "PHP time stamp - " . $timestamp1 . "<br/>"; } catch(Exception $e) { echo $e->getMessage(); } catch(InvalidArgumentException $e) { echo $e->getMessage(); } function get_timestamp($time_param) { $time_param_length = count($time_param); if($time_param_length!=0) { for($i=0;$i<$time_param_length;$i++) { if(!is_numeric($time_param[$i])) { throw new InvalidArgumentException("parameter $i should be numeric, " . gettype($time_param[$i]). " is given"); } } } else { throw new Exception("no argument is passed for calculating timestmap"); } $timestamp = mktime($time_param[0], $time_param[1], $time_param[2], $time_param[3], $time_param[4], $time_param[5]); return $timestamp; } ?> |
برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود
در اسکریپت php بالا , ما مقدار timestamp
را با تابع mktime() در php بر اساس پارامتر های آرایه پاس داده شده محاسبه می کنیم . از آنجایی که تابع mktime مقادیر عددی را به عنوان مختصات زمانی دریافت می کند, مجبور هستیم که تمام پارامتر ها را قبل از پاس دادن به این تابع بررسی کنیم.
در هنگام اعتبارسنجی , اگر نوع داده ای اشتباه باشد , پس یک InvalidArgumentException
پرتاب (thrown) می شود . در این جا , اگر پارامتر های آرایه خالی باشند , پس یک کلاس نمونه از Exception
پرتاب می شود .
این دو استثنا توسط دو بلاک catch جدا از هم برای یک بلاک try در این مثال استفاده شده اند .
Try-catch تو در تو
ما یک بلاک تو-در-تو php برای مدیریت مدیریت استثنا های بوجود آمده در بلاک قبلی ایجاد کردیم . برای مثال . اگر یک فایل آپلود کنیم , باید چک کنیم آیا از قبل وجود داشته یا خیر. اگر همچنین فایلی وجود نداشت , پس php یک file not found و بعد unable to upload file را به عنوان استثنا ایجاد میکند.
در چنین مواقعی , می توانید برای از try-catch های تو-در-تو برای نمایش خطاهای همه exception ها پیش آمده نشان بدید . برای مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php try{ upload_file("testfile.php"); } catch (Exception $e){ echo $e->getMessage() . "<br/>"; while($e = $e->getPrevious()) { echo 'Previous Error: '.$e->getMessage() . "<br/>"; } } function upload_file( $filename){ try{ if(file_exists($filename)){ // code for file uploading } else { throw new Exception( 'file not found'); } } catch (Exception $e){ throw new Exception( 'unable to upload file',0,$e); } } ?> |
با پاس دادن یک نمونه از ارور exception قبلی می توانیم استثناهای تو-در-تو را مدیریت کنیم . و اسکریپت php بالا خروجی زیر را برگشت میدهد .
1 2 |
unable to upload file Previous Error: file not found |
نکته :
- می توانیم توابع سفارشی خود را به عنوان تابع مدیریت خطا توسط
set_exception_handler()
در php ست کنیم - در ورژن php5.5 و به بالا , می توانیم از بلاک
finally
برای مدیریت خطا در php استفاده کنیم . کد های داخل این بلاک به هر صورت چه خطایی ایجاد شود یا خبر , اجرا خواهد شد .
امیدوارم از آموزش مدیریت خطا در php نهایت استفاده را برده باشید . برای دانلود سورس این آموزش از باکس دانلود استفاده کنید.
هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید
سلام مهندس شفیعی وقت بخیر من خطاهای فرم ویرایش رو تو یک آرایه ریختم وقتی خطا اتفاق میفته صفحه ویرایش سفید میشه و خطا ها نشون داده میشه میخوام خطا ها بالای فرم نشون داده بشن فرم هم باشه چیکار باید کرد عکساشو تو چت فرستادم براتون تشکر از راهنمایی تون
سلام.
در این بلاک
catch(Exception $e) {
}
خطا رو داخل یک متغییر بریزید $error_msg = $e->getMessage و این متغییر رو بالای فرم html با echo نمایش بدید.
سلام مهندس شفیعی عزیز خدا قوت من برای یک فرم ثبت آگهی میخوام چند تا خطا رو با هم نشون بدم خطا ها رو ریختم تو آرایه میخوام آرایه ای که مقدار دهی شده رو تو url بفرستم به همین صفحه و دریافت کنم و نشون بدم ولی کار نمیکنه اصلا میشه اینکار رو کرد یعنی آرایه ای که قبلا مقدار دهی شده رو تو url بفرستیم با تشکر
سلام ممنون.
خیر آرایه رو نمیتونید در یک url ارسال کنید باید json_encode کنید و بعد بصورت POST ارسال کنید و در اون صفحه هم دریافت و بعد json_decode کنید تا آرایه قابل خواندن باشد.
https://netparadis.com/post-json-data-using-php-curl
باسلام ممنونم بابت مطلب
ولی اگر کدها ریفکتور بشن و نمایش داده بشه خیلی بهتر میشه