Menu

Monday, May 27, 2019

[Laravel - Exception] ข้อควรระวัง: โปรดระวังการใช้ Exception class ใน catch เมื่อใช้ try...catch
[Laravel - Exception] Warning: Using Wrong Exception Class in catch when Using try...catch

try...catch ถูกใช้ในการ handle exception

อย่างไรก็ตาม มีบางกรณีที่ทำให้ exception ไม่ถูก handle ในส่วนของ catch และถูก throw ออกไปโดยไม่มีการ handle ใดๆ

ผมจะใช้โค้ดตัวอย่างเพื่อแสดงว่า โค้ดส่วนใดที่คุณต้องระวังเป็นพิเศษ

โค้ดทั้งสองตัวอย่างเป็น Laravel commands ที่สามารถเรียกใช้งาน โดยรันคำสั่งใน console ดังนี้
php artisan test-exception
ตัวอย่างที่ 1 กำหนด Exception Namespace ไม่ถูกต้อง
<?php

namespace App\Ship\Commands;

use App\Ship\Parents\Commands\ConsoleCommand;

class TestCommand extends ConsoleCommand
{

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'test-exception';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Test exception';

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        try {
            abc;
        } catch (Exception $ex) {
            dump('There is error.');
        }
    }
}
ผลลัพธ์การรันจะเป็นดังภาพ

จากผลลัพธ์จะพบว่า exception จากภายในส่วนของ try จะถูกแสดงในหน้า console โดยไม่มีการ handle ใดๆ ยิ่งไปกว่านั้น คือ ไม่มี exception เกี่ยวกับ Exception class ที่เรากำหนด Namespace ผิดในส่วนของ catch ด้วย

ตัวอย่างที่ 2 กำหนด Exception Namespace ถูกต้อง
<?php

namespace App\Ship\Commands;

use App\Ship\Parents\Commands\ConsoleCommand;
use Exception;

class TestCommand extends ConsoleCommand
{

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'test-exception';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Test exception';

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        try {
            abc;
        } catch (Exception $ex) {
            dump('There is error.');
        }
    }
}
ผลลัพธ์การรันจะเป็นดังภาพ
จากผลลัพธ์จะพบว่า exception จากภายในส่วนของ try จะถูก handle ในส่วนของ catch

No comments:

Post a Comment