سلام و احترام
ببینید شما خیلی ساده میتونید برای خودشون 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 کنیم
سلام و احترام
شما باید استفاده از 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 ها از چهار نوع خطای زیر پیروی میکنن
اما برای مثال اگه ما یک خطای 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 نکردن؟
سلام
منظورشون اینکه وقتی که داخل برنامه به یک خطا بر میخوریم اگر در برنامه از Error ها استفاده کرده باشیم خوده php برنامه را متوقف می کند (بدونه اینکه ما دخالتی داشته باشیم ) و کد خطا + نام خطا را داخل خروجی به ما نمایش میده . و باید این خطا را رفع کنیم تا برنامه از اول کار بکند. وگرنه برنامه کار نمیکند.
ولی وقتی از Exception ها استفاده می کنیم. وقتی در برنامه به یک خطا برخورد کردیم میتوانیم این خطا را دریافت کنیم و این خطا برنامه تحت کنترل ما هست، یعنی اینکه میتوانیم به خطا اجازه توقف برنامه را ندیم یا بگیم کد را نمایش بده .( هرکاری که میخوایم .)
در نمودار زیر گذاشتید . گفته Error به چهار دسته تقسیم میشوند که معلوم نیست کدام یکی از این خطا مربوط به کدام اصل هستند . ولی در Exception ها خطا ها مشخص کرده و داخل دو دسته بندی قرار داده شده .
۱) LogicException ( که زیر شاخه جستوجو کنید ) ۲) RuntimeException است خطایی است که در حین اجرا بر میخوریم .. ( زیر شاخه مخصوص به خود را دارد.)
.’امیدوارم که متوجه شدید. اگر مشکلی داشت لطفا بقیه تحصیح کنن
.موفق باشید