15장 예외 처리와 디버깅

15.1. 전역 예외 처리기

// 코드 15-1 app/Http/Controllers/ArticlesController.php

public function show($id)
{
    echo $foo;

    return __METHOD__ . '은(는) 다음 기본키를 가진 Article 모델을 조회합니다.:' . $id;
}

그림 15-1 라라벨의 역추적 로그

// 코드 15-2 app/Exceptions/Handler.php

class Handler extends ExceptionHandler
{
    protected $dontReport = [...];

    public function report(Exception $e)
    {
        parent::report($e);
    }

    public function render($request, Exception $e)
    {
        return parent::render($request, $e);
    }
}

15.2. 실용적인 예외 처리

// 코드 15-3 app/Http/Controllers/ArticlesController.php

public function show($id)
{
    $article = \App\Article::findOrFail($id);

    return $article->toArray();
}
// 코드 15-4 app/Exceptions/Handler.php

public function render($request, Exception $e)
{
    if (app()->environment('production')) {
        if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
            return response(view('errors.notice', [
                'title'       => '찾을 수 없습니다.',
                'description' => '죄송합니다! 요청하신 페이지가 없습니다.'
            ]), 404);
        }
    }

    return parent::render($request, $e);
}
<!-- // 코드 15-5 resources/views/errors/notice.blade.php -->

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>{{ $title }}</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  <style>
    * { line-height: 1.5; margin: 0; }
    html { color: #888; font-family: sans-serif; text-align: center; }
    body { left: 50%; margin: -43px 0 0 -150px; position: absolute; top: 50%; width: 300px; }
    h1 { color: #555; font-size: 2em; font-weight: 400; }
    p { line-height: 1.2; }
    @media only screen and (max-width: 400px) {
      body { margin: 10px auto; position: static; width: 95%; }
      h1 { font-size: 1.5em; }
    }
  </style>
</head>
<body>
  <h1>{{ $title }}</h1>
  <p>{{ $description }}</p>
</body>
</html>
# 코드 15-5 .env

APP_ENV=production

그림 15-2 운영 환경에서 사용자가 보게 될 오류 메시지

15.3. 디버깅

15.3.1. 버그란?

15.4. 디버깅 방법

15.4.1. dd() 도우미 함수

// 코드 15-6 app/Http/Controllers/ArticlesController.php

public function show($id)
{
    $article = \App\Article::findOrFail($id);
    dd($article);
    return $article->toArray();
}
# HTTP 15-1 dd() 도우미 함수의 반환값

GET /articles/1 HTTP/1.1
Host: 호스트:포트

# Article {#183 ▼
#   #fillable: array:2 [▶]
#   # ...
#   #attributes: array:6 [▶]
#   # ...
# }

15.4.2. 뷰 디버깅

// 코드 15-7 app/Http/Controllers/ArticlesController.php

public function index()
{
    $articles = \App\Article::latest()->paginate(3);
    dd(view('articles.index', compact('articles'))->render());
    return view('articles.index', compact('articles'));
}

15.4.3. 쿼리 디버깅

# 콘솔 15-1 toSql()

$ php artisan tinker
>>> $queryLoyalUsers = App\User::where(
    'last_login', '>', Carbon\Carbon::now()->subMonth()
)->toSql();
=> "select * from `users` where `last_login` > ?"

15.4.4. 콘솔 디버깅

# 콘솔 15-2 아티즌 오류

$ php artisan migrate
# Fatal error: Call to undefined method Illuminate\Database\Schema\Blueprint::password()

15.4.4. 외부 컴포넌트 이용

15.5. 마치며

$ git commit -m '예외 처리와 디버깅'
$ git tag 1015-exception-debugging

results matching ""

    No results matching ""