PDA

View Full Version : مدیریت استثنا ها در php



IMANAZADI
یک شنبه 08 بهمن 1396, 16:43 عصر
با سلام


من چند روز میخواستم بجای بررسی خطا های و استثناهای به شکل قدیمی در کلاسها ، از مدیریت خطای خود php که همون exception هاست استفاده کنم


اما متوجه یه نکته ای شدم حالا نمیدونم درست میگم یا خیر


در زبان هایی مثل جاوا و سی شارپ وقتی یک استثنا در بلوک try ایجاد میشه بخش catch وارد عمل میشه ولی تو php یکم قضیه فرق میکنه


توی php حتما باید استثنا یا خطا رو خودمون پیگیری کنیم و برای اون از throw استفاده کنیم


واسه اینکه متوجه بشیم یک مثال میزنم


کد زیر در زبان php رو در نظر بگیرید :




function div($a , $b)
{
return $a/$b;
}




try
{
div(7, 0);
}
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}



وقتی این کد رو اجرا میکنیم try catch عمل نمیکنه تا زمانیکه کد به شکل زیر دربیاد




function div($a , $b)
{
if($b ===0)
{
throw new Exception('err : taghsim bar sefr');
}

return $a/$b;
}




try
{
div(7, 0);
}
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}



یعنی باید حتما خودمون استثانا رو پیدا و واسه اون throw تعریف کنیم


در حالیکه در زبان های دیگه مثل جاوا داریم






public static void main(String[] args)
{
try
{
div(7, 0);
}
catch(Exception e)
{
System.out.println("message : "+e.getMessage());
}
}


public static int div(int a, int b)
{
return a/b;
}









اگر قرار باشه برنامه نویس از تمام استثناها اطلاع داشته باشه که تو خود کدنویسی جلوی اونها رو میگیره دیگه چه کاری هست که بخوایم از exception ها استفاده کنیم


مثال بالا بدون مدیریت exception




$msg = '';


function div($a , $b)
{
global $msg;

if($b ===0)
{
$msg = 'err : taghsim bar sefr';
return false;
}

return $a/$b;
}




if( ! div(7,0))
{
global $msg;
echo $msg;
}

plague
یک شنبه 08 بهمن 1396, 18:47 عصر
من دقت نکردم تا حالا زیاد بهش چون معمولا فقط برای عملیات دیتابیس استفاده میکنم ازش
ولی مشکل شما اینه که /0 یه warning تولید میکنه نه خطا که exception نمیتونه بگیرتشون همچنین notice ها هم به همین شکل
فکر میکنم خودت میتونی کلاس exeption ارث بری کنی و ارتقا کنی بدی تا وارنینگ ها رو هم ساپورت کنه .... این رو بخون

https://creotiv.wordpress.com/2011/06/09/handling-notice-and-warning-with-try-catch-in-php/

IMANAZADI
یک شنبه 08 بهمن 1396, 20:00 عصر
من دقت نکردم تا حالا زیاد بهش چون معمولا فقط برای عملیات دیتابیس استفاده میکنم ازش
ولی مشکل شما اینه که /0 یه warning تولید میکنه نه خطا که exception نمیتونه بگیرتشون همچنین notice ها هم به همین شکل
فکر میکنم خودت میتونی کلاس exeption ارث بری کنی و ارتقا کنی بدی تا وارنینگ ها رو هم ساپورت کنه .... این رو بخون


درسته warning تولید میکنه ولی چرا در زبانهای دیگه همین تقسیم بر صفر رو استثنا میگیره ولی در php خیر

غیر از اون من واسه خطای مهلک fatal error هم چک کردم بازم باید از throw استفاده کرد در غیر اینصورت catch عمل نمیکنه

مثال




function add()
{

require_once('file.php'); // this file not exist and create fatal error

}


try
{
add();

}

catch(Exception $e)
{
echo $e->getMessage();

}

plague
دوشنبه 09 بهمن 1396, 01:43 صبح
قرار نیست همه زبان ها مثل هم کار کنن
مثلا تو php عبارت 1 == '1' صحیح هستش در حالی که تو زبان های دیگه نه تنها صحیح نیست بلکه اررور هم میگری اگه اینکارو بکنی

IMANAZADI
دوشنبه 09 بهمن 1396, 06:08 صبح
قرار نیست همه زبان ها مثل هم کار کنن
مثلا تو php عبارت 1 == '1' صحیح هستش در حالی که تو زبان های دیگه نه تنها صحیح نیست بلکه اررور هم میگری اگه اینکارو بکنی

این مثال شما زیاد صحیح نیست چون در php دیتاتایپ متغییر توسط خود مفسر تشخیص داده میشه و یکی از گزینه های php هست و تازه جدیدا زیاد تاکید میشه که از === استفاده کنید و علاوه بر اون در php نسخه 7 data type متغیر ها گنجانده شده که مثل زبانهای دیگه نوع هر متغییر تعیین شود البته الان آپشنال هست و به اختیار برنامه نویسه که فعال یا غیر فعال باشه

از این مطلبم هم رد بشیم واسه خطاهای مهلک هم خود php نمیتونه تشحیص بده و باید حتما از throw استفاده کنیم

plague
دوشنبه 09 بهمن 1396, 14:02 عصر
اینکه دیتا تایپ توسط مفسر تشخیص داده میشه یا اینکه توصیه شده از === استفاده بشه کدومشون نقض میکنه حرفی که من زدم رو ؟
منظور این بود که php یه سری کار ها رو متفاوت با بقیه زبان ها انجام میده و قرار نیست همه زبان ها مثل هم باشن
کافیه سرچ کنی why php sucks یا همچنین چیزایی تا کلی مقاله ببینی که میزنن تو سر php که چرا با بقیه زبان ها فرق داره



try/catch blocks only work for thrown exceptions (throw Exception or a subclass of Exception must be called). You cannot catch fatal errors using try/catch.


شاید بتونی اکستندکنی کلاس رو مثل وارنینگ و نوتیس