۹ محمدجوکار
ساختن Exception
جامعه پی اچ پی ایجاد شده در ۱۵ بهمن ۱۴۰۱

عرض سلام

من قصدم اینه که یه اکسپشن بسازم

انگار اینطوریه که باید اول یه اکسپشن والد بسازم،‌ و بعد انواع اکسپشنی که میتونه وجود داشته باشه رو، بچه‌ی اون در نظر بگیرم و قائده‌ی وراثت و این داستان‌ها

اما حالا یه سوال:‌

من چطوری باید به ترای کچ بفهمونم که الان این یه اکسپشنه؟ چطوری بفهمونم که بیاد با کلاسی که من ساختم و دارم بهش پاس میدم، مثل اکسپشن‌های خود php‌ برخورد کنه؟؟؟؟

class MyException 
{
    /**
     * Properties: 
     */
    private string $message;
    private string $line;
    /**
     * Methods: 
     */
    public function __construct($message = '', $line = '')
    {
        $this->message = $message;
        $this->line = $line;
    }
    public function getMessage()
    {
        return $this->message;
    }
    
    public function getLine()
    {
        return $this->line;
    }
}
try 
{
} catch (MyException $e)
{
    $e->getMessage('Testttttttt!!!!');
}

البته الان که دقت میکنم، نمیتونم حتی به این روشی که بالا try catch رو نوشتم، کد بنویسم وباید به یکی از روشهای زیر باشه (که نمیدونم درستن یا نه

try 
{
bad coooooood ;
} catch (MyException $e)
{
    throw new MyException('there was an Error: ') . $e->getMessage() ;
    (new MyException('there was an Error: '))->getMessage() ;
}
محمدجوکار ۱۵ بهمن ۱۴۰۱، ۱۳:۵۳

سلام محمد عزیز

برای ساخت اکسپشن شما باید توی کلاستون Exeption که برای هسته php هست رو اکستند کنید.

class testExeption extends Exeption{}
$a=5;
try{
if($a==5)
throw new testExeption('number not valid!');
}catch(testExeption $e){
echo $e->getMessage();
}
احمدرضا فاطمی کیا ۱۵ بهمن ۱۴۰۱، ۱۴:۰۲

یعنی مثلا باید یه همچین چیزی رو پیاده سازی بکنیم؟؟؟؟


class customException extends Exception {
    public function Uncaught() {
      //error message
      return 'Uncaught Exception: ' . $this->getMessage() . ' In Line; ' . $this->getLine(); 
    }
    public function PDO() {
      //error message
      return 'PDO Exception: ' . $this->getMessage() . ' In Line; ' . $this->getLine();
    }
    public function Syntax() {
      //error message
      return 'Syntax Exception: ' . $this->getMessage() . ' In Line; ' . $this->getLine(); 
    }
}
$name = 'Mohadmmad';
try {
    if($name != 'Mohammad')
        throw new customException('dont match your filed name!!!');
} catch (customException $e) {
    echo $e->Uncaught();
}
محمدجوکار ۱۵ بهمن ۱۴۰۱، ۱۵:۳۴

یه مشکل هم دارم:‌

با توجه به کدهای بالا، اگر من به یه خطای دیگه بخورم، دیگه هندلش از دستم خارجه؛ مثه این:

9500-Screenshot (686).png


چطوری باید جلوی این خطا رو بگیرم که در لاین ۱۰۰ وجود داره؟؟؟؟

مثلا میخوام بگم درسته که به خاطر قالب و چهارچوب، اومدم کلاس اکسپشنم رو اکستند کردم از اکسپشن اصلی، ولی خب نمیخوام دیگه ارورهاش به وسیله اون هندل بشه. میخوام برای انواع ارورها، خودم کاستومایز شده، توی کلاس چایلدم هندل کنم.

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

محمدجوکار ۱۵ بهمن ۱۴۰۱، ۱۵:۴۴

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


در حقیقت، ما یکسری کد مینویسیم در بلاک try، حالا با توجه به اشتباهاتی که ما در کدهامون کردیم، یا مشکلاتی که قراره پیش بیاد، ارور یا اکسپشن‌های مختلفی هم میتونه رخ بده.

در اینجا ما باید با catch()‌های مختلف،‌ بگیم که مثلا اگر اروری که قراره پیش بیاد، یکی از تایپ‌های زیر بود،‌ ارور یا اکسپشن رو، به نحوی که ما میگیم بیا و نشون بده:

       Error
      ArithmeticError
        DivisionByZeroError
      AssertionError
      ParseError
      TypeError
        ArgumentCountError
    Exception
      ClosedGeneratorException
      DOMException
      ErrorException
      IntlException
      LogicException
        BadFunctionCallException
          BadMethodCallException
        DomainException
        InvalidArgumentException
        LengthException
        OutOfRangeException
      PharException
      ReflectionException
      RuntimeException
        OutOfBoundsException
        OverflowException
        PDOException
        RangeException
        UnderflowException
        UnexpectedValueException
      SodiumException

ما نمیتونیم تایپ ارورهایی که قراره به وجود بیاد رو تعیین بکنیم،‌ فقط میتونیم بگیم در صورت وقوع هر نوع تایپی، چه مدلی برخورد بشه باهاش...


محمدجوکار ۱۵ بهمن ۱۴۰۱، ۱۶:۰۲

بله همینطور هست.

در واقع شما ارور هندلینگ رو انجام میدید.

عنوان سرفصل هم همین مورد هست.

احمدرضا فاطمی کیا ۱۵ بهمن ۱۴۰۱، ۱۶:۱۱

آقا من اصلا همه چیز رو با هم قاطی کردم

خب الان اگر پیام آخریه من درست باشه، صدتا سوال دیگه برام بوجود میاد

وقتی ما نمیتونیم بگیم که در بلاک try چه خطایی به وجود بیاد، چطوری میتونیم برای اون خطایی که ممکنه به وجود بیاد، در بلاک catch بیایم تایپ مشخص کنیم؟؟؟

البته منظورم اینه که بخوایم جزئی کار کنیم. نه اینکه بیایم دوتا catch پرنت ارور و اکسپشن براش بنویسیم. حالا اگه بخوایم جزئی کار کنیم، باید برای یه کد، بیستا catch بنویسیم؟؟؟؟؟

محمدجوکار ۱۵ بهمن ۱۴۰۱، ۱۶:۱۵

یه سوال دیگه:

پس اینکه کلاس اکسپشن جدید میسازیم و اکستند میکنیم از اکسپشن اصلی

چطوری میشه که میایم در بلاک کچ، جای تایپ‌های اکسپشن یا ارور میزاریمش؟؟؟

معنی کار زیر چیه؟؟؟؟؟

class customException extends Exception {
    public function Uncaught() {
      //error message
      return 'Uncaught Exception: ' . $this->getMessage() . ' In Line; ' . $this->getLine(); 
    }
    public function PDO() {
      //error message
      return 'PDO Exception: ' . $this->getMessage() . ' In Line; ' . $this->getLine();
    }
    public function Syntax() {
      //error message
      return 'Syntax Exception: ' . $this->getMessage() . ' In Line; ' . $this->getLine(); 
    }
}
$name = 'Mohadmmad';
try {
    if($name != 'Mohammad')
        throw new customException('dont match your filed name!!!');
} catch (customException $e) {
    echo $e->Uncaught();
}



انگار این کار،‌ فقط زمانی کاربرد داره که من بخوام کلی کار کنم و بگم هرمدلی از اکسپشن اتفاق افتاد، بیا و اینطوری هندلش کن.

دقیقا مثه کد زیریه فقط خودم میتونم یکم متن پیامشو بیشتر مدیریت کنم

2bb9-Screenshot (687).png

محمدجوکار ۱۵ بهمن ۱۴۰۱، ۱۶:۱۷

محمد جان

ارور هندلینگ رو خود php برامون تا حد زیادی انجام میده.

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

پس نیازی نیست که ما بیایم برای هر خطایی یک کلاس بزنیم.

ضمنا ما توی بلاک ترای میام خطا پرتاب میکنیم که کچ دریافتش کنه؛ پس خطاهارو یا خود php یا ما پرتاب میکنیم.

این نوع پیاده سازی اکسپشن هم غلط هست.

پیشنهاد میکنم خیلی روی این موارد حساس نشید.

توی پروژه‌های ادامه دوره تین موارد کامل برای شما مفهوم میشه.

بهترین پاسخ
احمدرضا فاطمی کیا ۱۵ بهمن ۱۴۰۱، ۱۶:۲۸