آموزش کار با Laravel Exception

ترجمه و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 13 خرداد 98
خواندن در 2 دقیقه
دسته بندی ها : لاراول

به عنوان یک توسعه دهنده PHP ممکنه شما از استثناء ها (Exception) استفاده کنید, چون اونها به شما اجازه میدن از رفتار غیرمعمول کاربران یا خطای احتمالی مطلع بشید. بدون استثناء ها, ممکنه که اپلیکیشن شما خطاهای ناخواسته رو نمایش بده و کار برای دیباگ سخت بشه. 

آموزش کار با Laravel Exception

استثناء ها بسیار ساده هستند و فرایند توسعه شما رو ساده تر می کنند. وقتی شما کار با استثناء ها رو یاد بگیرید, این یکی از بخش های معمول توسعه شما خواهد شد.

اما یک استثناء چیست؟

من فکر میکنم بهترین تعریف برای اون توسط Martin Fowler گفته شده :

"استثناء ها چیزی غیر از حد انتظار رفتار مورد نظر ما را نمایش می دهند."

در حقیقت, یک استثناء یک رویداد هست, که در طول اجرای برنامه اتفاق میافتد و روال عادی برنامه رو بهم میریزه. وقتی شما یک استثناء رو trhow می کنید, سیستم اون رو با جستجو در سیستم مدیریت catch کرده و پیام مورد نظر رو برمیگردونه.

try { 

    // the code goes here 

} catch (Exception $e) { 

    // if an exception happened in the try block above 

}

Laravel Exception چیست؟

لاراول از مدیر استثناء ها استفاده میکنه که یک کلاس در App\Exceptions\Handler.php هست. این کلاس شامل دو متد اصلی (متد renderHttpException, که برای تمام استثناء های HTTP استفاده میشه مثل 404 و 503, در کلاس والد Handler وجود داره). اولی report هست که برای گزارش گیری استثناء ها یا ارسال اون ها به یک سرویس خارجی استفاده میشه. اینجا یک مثال از متد ریپورت هست :

public function report(Exception $e)
{
    if ($e instanceof CustomException) {
        //
    }

    return parent::report($e);

}

دومی render هست. متد render مسئول تبدیل یک استثناء داده شده به یک پاسخ HTTP هست که باید به مرورگر برگشت داده بشه. این مثالی از متد رندر هست :

public function render($request, Exception $e)
{
    if ($e instanceof CustomException) {
        return response()->view('errors.custom', [], 500);
    }

    return parent::render($request, $e);
}

نکته : شما میتونید از پراپرتی dontReport$ برای نادیده گرفتن استثناء ها با نوع استفاده کنید.

شما میتونید متدهای Laravel Exceptions رو به صورت دلخواه مثل زیر بازنویسی کنید :

public function render($request, Exception $e)
{
    if (config('app.debug')) {

        return parent::render($request, $e);

    }

    return $this->handle($request, $e);

}

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

چگونه Laravel Exception خودمون رو بسازیم؟

ممکنه نیاز باشه که شما کلاس استثناء خودتون رو بسازید. شما باید کلاس استثناء پایه لاراول رو گسترش بدید - من یک کلاس abstract ساختم که به عنوان کلاس پایه ی کلاس استثناء سفارشی ما عمل میکنه. یک فایل در App/Exceptions/monException.php بسازید :

namespace App\Exceptions;

use Exception;

abstract class monException extends Exception
{
    protected $id;

    protected $details;

    public function __construct($message)
    {

        parent::__construct($message);

    }

    protected function create(array $args)
    {
        $this->id = array_shift($args);

        $error = $this->errors($this->id);

        $this->details = vsprintf($error['context'], $args);

        return $this->details;

    }

    private function errors($id)
    {
        $data= [

            'not_found' => [

                'context'  => 'The requested resource could not be found but may be available again in the future. Subsequent requests by the client are permissible.',

            ]

            //   ...

        ];

        return $data[$id];

    }

}

کلاس استثناء خودتون رو اضافه کنید :

namespace App\Exceptions;

class NotFoundmonException extends  monException
{
    public function __construct()
    {
        $message = $this->create(func_get_args());

        parent::__construct($message);

    }

}

شما میتونید کلاس بالا رو در کد استفاده کنید :

try {
    throw new \App\Exceptions\NotFoundmonException('not_found');
}
catch(\App\Exceptions\NotFoundmonException $e)
{
    return $e->getMessage();
}

در کنار کلاس استثناء هسته لاراول شما میتونید از پکیج Assertion استفاده کنید. این میتونه به عنوان یک کلاس استنثاء خارجی استفاده میشه.

برای نصب این پکیج کافیه دستور زیر رو وارد کنید :

composer require beberlei/assert

برای مثال اگر بخواهید آدرس ایمیل کاربر رو چک کنید کافیه بصورت زیر عمل کنید :

use Assert\Assertion;

use Assert\AssertionFailedException;

//...

try {

    Assertion::email($value, "The value must be valid E-mail address");

} catch(AssertionFailedException $e) {

    $e->getValue(); // the value that caused the failure

    $e->getConstraints(); // the additional constraints of the assertion.

}

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید