تفاوت بین Exception و Error در php

پرسیده شده
فعالیت 1054 روز پیش
دیده شده 807 بار
0

سلام

 

As of PHP ۷, PHP divides errors into two unique classes: Exception and Error

 

میشه کمی درمورد تفاوت دو مورد بالا توضیح بدید. و اینکه چه زمانی یک نمونه از throw ، error میشه و چه زمانی یک نمونه از exception

فایل پیوست

علی.
علی.

7 اردیبهشت 00

0
حذف شده

سلام و احترام

ببینید شما خیلی ساده میتونید برای خودشون Exception بسازید، به چه صورت؟

class MyException extends Exception
{
  


}

شما خیلی ساده یه کلاس میسازید که مثلا تو کد بالا MyException هستش و خود کلاس Exception رو extends میکنید و خیلی راحت شما Exception خوتون رو ساختید. حالا کجا به کار میاد؟

برای مثال شما میخواید زمانی که کاربر لاگین میخواد بکنه یه Exception به اصطلاح throw کنید، به طور پیش فرض میتونید خیلی ساده خود کلاس Exception رو throw کنید اما برای اینکه یه کلاس مجزا براش داشته باشید تا بتونید یه کارای دیگه هم باهاش انجام بدید به صورت اختصاصی میایید یه Exception مثلا به اسم LoginFailedException رو ایجاد میکنید:

class LoginFailedException extends Exception
{
	protected $message = 'یک پیام پیش فرض تستی';

} 

 

حالا تفاوت اصلی با Error ها چی هستن؟

 

Error های توی php قابل کنترل نیستن به این معنی که وقتی خطایی از نوع Error اتفاق بیوفته برنامه شما متوقف میشه مثلا شما یه خطای syntax دارید برنامه شما قطعا متوقف میشه حتی اگه شما اونو داخل try catch هم بزارید  اما برای Exception ها اینطور نیست و شما میتونید اونارو catch کنید و اجازه بدید برنامه جلو بره یا کار دیگه انجام بدید 

 

 

 

حالا این وسط ما یه سری Error داریم که throwable هستش تا بتونیم اونارو catch کنیم و مثلا بزاریم ادامه برنامه اجرا بشه یا هر تصمیمی که خواستیم دربارشون بگیریم

interface Throwable
    |- Exception implements Throwable
        |- ...
    |- Error implements Throwable
        |- TypeError extends Error
        |- ParseError extends Error
        |- ArithmeticError extends Error
            |- DivisionByZeroError extends ArithmeticError
        |- AssertionError extends Error

مثلا مثال کدی که در بالا بود

try {
    $result = is_finite(1.0 / 0);
}
catch (DivisionByZeroError $e) {
    echo $e->getMessage();
}

توی مثال بالا هم وقتی تابع متوجه میشه که این تقسیم به بی نهایت میرسه مفسر php خطا رو تولید میکنه و میده به catch حالا catch هر کاری خواست میکنه. اما برای مثال اگه fatal error بود ما نمی تونستیم اون رو catch کنیم

 

فایل پیوست

امیر صالحی

توسط

امیر صالحی

8 اردیبهشت 00

0
حذف شده

سلام و احترام

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

<?php
try {
    throw new Exception("This is an exception");
}
catch (Throwable $e) {
    echo $e->getMessage();
}

یا

<?php
try {
    $result = eval("2*'7'");
}
catch (Throwable $e) {
    echo $e->getMessage();
}

اما با Error Class ها ما صرفا فقط میتونیم خطا های داخلی php رو کنترل کنیم. فرقش با exception چیه؟ اینکه ما خودمون میتونیم برای خودمون Exception بسازیم اما error class ها از چهار نوع خطای زیر پیروی میکنن

ArithmeticError

TypeError

ParseError

AssertionError

 

اما برای مثال اگه ما یک خطای division by zero داشته باشیم خب این جزء دسته خطای های arithmaticError ها هستش

 

try {
    $result = is_finite(1.0 / 0);
    if (in_array($result, [INF, NAN,-INF])) {
        throw new DivisionByZeroError('Division by zero error');
    }
}
catch (DivisionByZeroError $e) {
    echo $e->getMessage();
}

و به شکل بالا کلاسش به catch داده میشه و در try به شکل بالا throw میشه، برای اینکه مثال های بیشتر برای درک بهتر رو ببینید میتونید به https://www.sitepoint.com/a-crash-course-of-changes-to-exception-handling-in-php-7/ لینک مراجعه کنید

فایل پیوست

امیر صالحی

توسط

امیر صالحی

7 اردیبهشت 00

حذف شده
ممنون از پاسختون. یه سوال دیگه هم داشتم از خدمتتون اونم این که exception نوعی خطاست یا یک رویداد ناخواسته هست که منجر به ایجاد خطا میشه؟
علی.

7 اردیبهشت 00

0
حذف شده

سلام و خسته نباشد

 

این بخش رو متوجه نشدم : (شما با استفاده از exceptionها میتونید هر نوع خطای throwable رو کنترل کنید و مهم نیست که چی هستش ) فکر کنیم منظورتون اینه : با throwable هم میتونیم exception هارو catch کنیم و هم error هارو

 

این بخش رو متوجه نشدم : (اینکه ما خودمون میتونیم برای خودمون Exception بسازیم اما error class ها از چهار نوع خطای زیر پیروی میکنن)

 

 

تو اون کدی که شما تو پاسخ قبلی گذاشتین اگه ما یک ابجکتی از کلاس divisionByZeroError ایجاد (throw) نکنیم هم php خودش اینکارو برای ما میکنه. وقتی خود php خطارو در قالب یه ابجکت Throw ، divisionByZeroError میکنه چه نیازی بود خودمون بیاییم اینکارو بکنیم؟

 

try {
    $result = is_finite(1.0 / 0);
}
catch (DivisionByZeroError $e) {
    echo $e->getMessage();
}

بعد تو عکسی که در پایین ضمیمه کردم سوالم اینه که چرا تو این hierarchy یه زیر شاخه برای error داریم و یک شاخه واسه exception ها ؟ فرقشون تو چیه؟ چرا error ها هم exception رو extends نکردن؟

 

فایل پیوست

علی.

توسط

علی.

7 اردیبهشت 00

0
حذف شده

سلام

 

منظورشون اینکه وقتی که داخل برنامه به یک  خطا بر میخوریم اگر در  برنامه از  Error ها استفاده کرده باشیم خوده  php برنامه را متوقف می کند (بدونه اینکه ما دخالتی داشته باشیم ) و کد خطا + نام خطا را  داخل خروجی به ما نمایش میده . و باید این خطا را رفع کنیم تا برنامه از اول کار بکند. وگرنه  برنامه کار نمیکند.

 

ولی  وقتی از  Exception ها  استفاده می کنیم. وقتی در برنامه به یک خطا برخورد کردیم میتوانیم این خطا را دریافت کنیم و  این خطا برنامه تحت کنترل ما هست، یعنی اینکه میتوانیم به خطا اجازه  توقف برنامه را ندیم  یا بگیم کد را نمایش بده .( هرکاری که میخوایم .)

 

در نمودار زیر گذاشتید . گفته Error به چهار دسته تقسیم میشوند که معلوم نیست کدام یکی از این خطا مربوط به  کدام اصل هستند . ولی در Exception ها خطا ها مشخص کرده و داخل دو دسته بندی قرار داده شده .

 ۱) LogicException ( که زیر شاخه جستوجو کنید )  ۲) RuntimeException است  خطایی است که در حین اجرا بر میخوریم .. ( زیر شاخه مخصوص به خود را دارد.)

 

.’امیدوارم که متوجه شدید. اگر مشکلی داشت لطفا بقیه تحصیح کنن

.موفق باشید

فایل پیوست

آرش مکینیان

توسط

آرش مکینیان

23 خرداد 00