🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ علی
تفاوت بین Exception و Error در php
امیر صالحی حل شده توسط امیر صالحی

سلام

 

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

 

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

سلام و احترام

شما باید استفاده از 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/ لینک مراجعه کنید

امیر صالحی ۰۷ اردیبهشت ۱۴۰۰، ۱۷:۰۰

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

 

این بخش رو متوجه نشدم : (شما با استفاده از 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 نکردن؟

 

علی ۰۷ اردیبهشت ۱۴۰۰، ۱۸:۵۵

سلام و احترام

ببینید شما خیلی ساده میتونید برای خودشون 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 کنیم

 

بهترین پاسخ
امیر صالحی ۰۸ اردیبهشت ۱۴۰۰، ۱۷:۱۵

سلام

 

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

 

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

 

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

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

 

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

.موفق باشید

آرش مکینیان ۲۳ خرداد ۱۴۰۰، ۰۶:۲۲