• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مدیریت استثنا ها در php
#1
با سلام

من چند روز میخواستم بجای بررسی خطا های و استثناهای به شکل قدیمی در کلاسها ، از مدیریت خطای خود 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;
}
  پاسخ
تشکر شده توسط :
#2
نقل قول: اگر قرار باشه برنامه نویس از تمام استثناها اطلاع داشته باشه که تو خود کدنویسی جلوی اونها رو میگیره دیگه چه کاری هست که بخوایم از exception ها استفاده کنیم
چطوری جلوشو میگیری؟

فکر کن ممکنه چندین نوع خطا در یک فانکشن رخ بده .
تو در نهایت مجبوری برای همشون یک false برگردونی از کجا میدونی کدوم خطا مربوط به چی بوده ؟؟؟

فکر کن توی ارتباط با دیتابیس یا اجرای کوئری خطا داری در یک فانکشن
چطوری تشخیص میدی خطای کدومشه ؟


فکر کن اصلا میخوای وقتی خطایی رخ داد توی یه ساختار درست حسابی نشونش بدی لاگش کنی و یه مدیریتی روی خطاهات داشته باشی
اونوقت چی؟
  پاسخ
تشکر شده توسط : ayoubsys
#3
نقل قول:چطوری جلوشو میگیری؟

همونطوری که تو پست بالا مثالش رو آوردم

نقل قول:فکر کن ممکنه چندین نوع خطا در یک فانکشن رخ بده .
تو در نهایت مجبوری برای همشون یک false برگردونی از کجا میدونی کدوم خطا مربوط به چی بوده ؟؟؟

واسه همه یک خطا بر نمیگردونیم ، برای هر خطا یک return false بر میگردونیم با توضیح خطای مربوطه .
واسه مثال شما هم باید به تعداد خطا ها throw به همراه توضیح خطا صادر کرد


نقل قول:فکر کن توی ارتباط با دیتابیس یا اجرای کوئری خطا داری در یک فانکشن
چطوری تشخیص میدی خطای کدومشه ؟

با exception ها چطوری میخوای تشخیص بدی ؟!!!
باید هر خطا یا استثنایی که به ذهنت میرسه واسش شرط گذاشته و اونو throw کنی و هر خطایی هم که از دستت در بره و به ذهنت نرسه یک fatal error رو صفحه پدیدار میشه
حالا واسه مثال بالا بجای استفاده از exception ها ، میتونی واسه هر خطا که به ذهنت میرسه یک شرح خطا به همراه return false بزاری که این حالتم اگر خطایی رو برنامه نویش پیش بینی نکنه بازم fatal error مشاهده میشه

حرف من اینه که دو آیتم بالا هیچ فرقی نمیکنه شاید فقط بشه بگی exception میتونه شماره خط خطا و چند تا آیتم دیگه رو برگردونه که اونم راه داره و میشه واسش یک تابع custom نوشت و از backtrace , ... استفاده کرد

حالا پست اول رو نگاه کنید ببینید زبانهایی مثل جاوا و سی شارپ بدون اینکه برنامه نویس اطلاع داشته باشه خود کامپایلر خطا رو مدیریت میکنه بدون اینکه برنامه نویس از قبل خطا رو شناسایی کرده باشه و واسش throw در نظر بگیره
روش درست رو جاوا و ... انجام میدن ، نه اینکه خودمون خطا رو پیدا کنیم بعد throw کنیم که catch اونو بگیره
البته منظورم این نیست که در جاوا نمیشه از throw استفاده کرد .
  پاسخ
تشکر شده توسط :
#4
نقل قول: حرف من اینه که دو آیتم بالا هیچ فرقی نمیکنه شاید فقط بشه بگی exception میتونه شماره خط خطا و چند تا آیتم دیگه رو برگردونه که اونم راه داره و میشه واسش یک تابع custom نوشت و از backtrace , ... استفاده کرد
Big Grin


نقل قول:حالا پست اول رو نگاه کنید ببینید زبانهایی مثل جاوا و سی شارپ بدون اینکه برنامه نویس اطلاع داشته باشه خود کامپایلر خطا رو مدیریت میکنه بدون اینکه برنامه نویس از قبل خطا رو شناسایی کرده باشه و واسش throw در نظر بگیره
خوبه میگی کامپایلر !

پی اچ پی هم مفسر داره مفسرش خطا رو میگیره اما خطاهایی که مثلا مشکل از شبکه و اتصال و اینا باشه چی ؟؟

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

ببین ساختار مدیریت خطا در پی اچ پی به این شکل ایجاد شده خب !
یعنی مکانیزمی برای مدیریت خطا داره
شما روش های من در آوردی استفاده میکنی و میگی جواب میده و فلانه و بهمانه
وقتی ساختار استانداردی براش هست یعنی اینکه اگه توی یه پروژه گروهی شرکت کنی هر کسی روش من در آوردی خودش رو نداشته باشه !

و طبق یک مکانیزم مشخص کار کنن .

حالا شما اومدی میگی سی شارپ اینه جاوا اونه پی اچ پی اینجاش ضعیفه خب که چی برادر من ؟
میخوای چیو ثابت کنی ؟
  پاسخ
تشکر شده توسط :
#5
اون قوائدی که راجب Java و Cs گفتی درسته، درمورد PHP هم صدق میکنه.
PHP هم InvalidArgumentException, OverflowException و... رو بصورت پیشفرض داره
اما:
در PHP مشکل DivByZero (و خیلی مشکلات دیگه) جزو دسته Error ها محسوب میشه نه Exception ها
ولی فقط در PHP 5 و قبلتر - در PHP 7 این مسله بهبود یافته: catch (DivisionByZeroError $e)
^ در اینجا میبینی که نوشته DivisionByZeroERROR، یعنی از دسته ErrorException ها هستش، نه حتی Exception
وبلاگ: Yousha.Blog.ir

صدام: "اگر با ارتش شاه ایران طرف بودیم، یک ماهه جنگ را می بردیم"
http://gulfnews.com/opinion/thinkers/ira...i-1.500997
  پاسخ
تشکر شده توسط : Reza
#6
نقل قول:خوبه میگی کامپایلر !

پی اچ پی هم مفسر داره مفسرش خطا رو میگیره اما خطاهایی که مثلا مشکل از شبکه و اتصال و اینا باشه چی ؟؟

الان این که گفتی یعنی چه Big GrinBig GrinBig Grin
خب مشخصه که php مفسر داره و جاوا کامپایلر Tongue

نقل قول:شما روش های من در آوردی استفاده میکنی و میگی جواب میده و فلانه و بهمانه
وقتی ساختار استانداردی براش هست یعنی اینکه اگه توی یه پروژه گروهی شرکت کنی هر کسی روش من در آوردی خودش رو نداشته باشه !

من تو پست اول یک تابع (procedual) رو مثال زدم که کسایی که با شی گرایی آشنایی ندارند (امثال شما) بدونن چی به چی هست وگرنه روشی که من مثال زدم من درآوردی نیست و دقیقا اگر کلاس های کدایگنایتر و یکسری دیگه از فریم ورک های دیگه رو بررسی کنی میبینی که از روش فوق واسه خطا یابی استفاده میکنن
معنی پروژه گروهی هم فهمیدیم به لطف شما
داداش اول برو با اصطلاحات نرم افزار و برنامه نویسی آشنا شو بعد بیا گل افشانی کن


نقل قول:حالا شما اومدی میگی سی شارپ اینه جاوا اونه پی اچ پی اینجاش ضعیفه خب که چی برادر من ؟
میخوای چیو ثابت کنی ؟

من سی شارپ و جاوا رو مثال زدم واسه باز شدن بیشتر مطلب وگرنه خودم تعصب خاصی روی php دارم
و اینکه لازم نمیبینم بخوام به شما چیزی رو ثابت کنم
  پاسخ
تشکر شده توسط :
#7
کد پی‌اچ‌پی:
$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;


نقل قول:من تو پست اول یک تابع (procedual) رو مثال زدم که کسایی که با شی گرایی آشنایی ندارند (امثال شما) بدونن چی به چی هست وگرنه روشی که من مثال زدم من درآوردی نیست و دقیقا اگر کلاس های کدایگنایتر و یکسری دیگه از فریم ورک های دیگه رو بررسی کنی میبینی که از روش فوق واسه خطا یابی استفاده میکنن
Angel
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 2 مهمان