Quay lại

Xử lý exception bằng cách sử dụng rescue() helper trong Laravel Chuyên mục PHP và Laravel    2023-06-20    1.1k Lượt xem    80 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Xử lý exception bằng cách sử dụng rescue() helper trong Laravel

Nếu bạn muốn làm cho ứng dụng web của mình trở nên mạnh mẽ thì việc handle exception là một điều rất cần thiết đúng không ? Như cách bình thường trong PHP thì chúng ta thường sử dụng sử dụng khối try-catch trong mã code của bạn đúng không. Điều này cũng được áp dụng tương tự trong của Laravel.

Để mình lấy một ví dụ như cách bình thường mà các bạn hay làm như sau :

Ví dụ, nếu bạn muốn xử lý exception khi xảy ra sự cố khi save/update , bạn thường xử lý ngoại lệ như dưới đây :

public function store(Request $request)
{  
    try   
    {  
        $comment = new BlogComment();  
        $comment->content = $request['comment'];  
        $comment->user_id = Auth::user()->id;  
        $comment->blog_id = $request['ticketId'];  
        $comment->save(); 
    } catch(Exception $e) { 
        if (!($e instanceof SQLException)) {
            app()->make(\App\Exceptions\Handler::class)->report($e); 
            // Report the exception if you don't know what actually caused it
        }
        request()->session()->flash('unsuccessMessage', 'Failed to add comment.');  
        return redirect()->back();
    }
}

Như bạn có thể thấy, chúng ta đang sử dụng xử lý lỗi có sẵn của Laravel trong khối catch để report ngoại lệ nếu nó xảy ra.

Bây giờ, điều này hoàn toàn OK nhưng bạn có biết có một cách gọn gàng hơn trong Laravel mà bạn có thể sử dụng để làm cho điều này thậm chí còn ngắn hơn. Đó là phương thức helper mà Laravel đã cung cấp sẵn cho chúng ta đó là phương thức rescue().

Cách sử dụng

Laravel đã cung cấp phương thức helper rescue() , phương thức này giúp bạn có thể pass mã code của mình vào một closure để mà handle exceptions, phương thức này sẽ thực thi và đưa vào một closure và bắt mọi ngoại lệ xảy ra trong quá trình thực thi. Tất cả các ngoại lệ bị sẽ được gửi đến exception handler.

Vì vậy, nếu chúng ta muốn viết lại ví dụ trước bằng cách sử dụng rescue() helper, chúng ta có thể làm như dưới đây.

public function store(Request $request)
{
    rescue(function () use ($request) {
        $comment = new BlogComment();  
        $comment->content = $request['comment'];  
        $comment->user_id = Auth::user()->id;  
        $comment->blog_id = $request['ticketId'];  
        $comment->save();
    }, function() {
        request()->session()->flash('unsuccessMessage', 'Failed to add comment.');  
        return redirect()->back();
    }, true);
}

Như bạn có thể thấy, rescue() helper có thể chấp nhận ba đối số.

  • Đối số đầu tiên như chúng ta đã thảo luận là closure chứa mã mà bạn muốn xử lý ngoại lệ.
  • Đối số thứ hai (optional) là closure sẽ được chạy nếu xảy ra ngoại lệ hoặc bạn cũng có thể chuyển vào đây giá trị mặc định sẽ được trả về khi xảy ra ngoại lệ.
  • Đối số thứ ba (optional) chấp nhận giá trị boolean sẽ xác định xem bạn có muốn report ngoại lệ hay không.
    • Nếu bằng true, rescue() helper sẽ report exception cho trình xử lý lỗi đã định cấu hình.
    • Nếu bằng fasle, rescue() helper sẽ không report ngoại lệ.

Nếu bạn tò mò, thì đây là cách định nghĩa chức năng của rescue() helper :

/**
 * Catch a potential exception and return a default value.
 *
 * @param  callable  $callback
 * @param  mixed  $rescue
 * @param  bool  $report
 * @return mixed
 */
function rescue(callable $callback, $rescue = null, $report = true)
{
    try {
        return $callback();
    } catch (Throwable $e) {
        if ($report) {
            report($e);
        }

        return $rescue instanceof Closure ? $rescue($e) : $rescue;
    }
}
 
 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday