09 Jul 2018
Laravel Hata Yönetimi İşlemleri (Error Handling)
  • 1054 Okuma
  • 0 Yorum
  • 18 Beğeni

Laravel Hata Yönetimi İşlemleri (Error Handling)

Programlamada oluşan hataları yakalamak ve uygun şekilde işlem yaparak bu hataların yönetimi önemli bir konudur ve "Exception handling" olarak karşımıza çıkmaktadır. Hataların yakalanması ve yönetimi web uygulamaları için de önemli bir konudur. Olası hataları yöneterek, kullanıcılara daha anlamlı hata mesajları gösterebilir ve veri bütünlüğünü sağlayabiliriz. Bu makaldemde Laravel ile hata yönteminin nasıl yapıldığını anlatmaya çalışacağım.


Birçok konuda olduğu gibi hata yönetimi konusunda da Laravel, temel yapılandırmaları hazır olarak sunmaktadır. Uygulamanın "debug" modu açık olarak gelmektedir ve oluşan hatalar web arayüzünde ayrıntılı olarak yer aldığı gibi "log" dosyasına da kaydedilmektedir.


Yapılandırma

Yukarıda da belirttiğim gibi "debug" modu varsayılan (default) olarak açık gelmektedir. "debug" mod ayarını "config/app.php" dosyası üzerinden yapılandırabileceğiniz gibi ".env" dosyası üzerinde "APP_DEBUG" değerini "true" ya da "false" şeklinde tanımlayarak da yapılandırabilirsiniz.


Uygulamayı geliştirme aşamasında "APP_DEBUG" değerinin "true" olması, geliştirme aşamasında oluşan hataları daha çabuk bulma ve çözme konusunda yardımcı olacaktır. Fakat bu değeri, uygulamayı kullanıcıların kullanıma sunduktan sonra "false" yapmayı unutmayın. "true" olması durumunda hem kullanıcılar anlamsız hata mesajları ile karşılaşabilirler hem de hata mesajları uygulamaya ait ayrıntılı bilgiler içerdiği için önemli bilgilerin (veritabanı kullanıcı adı ve şifresi gibi) son kullanıcılar tarafından öğrenilmesine neden olabilir.


Hata Yakalama İşlemleri


Laravel ile bütün hatalar "App\Exceptions\Handler" sınıfı tarafından yakalanmaktadır. Bu sınıf "report" ve "render" olmak üzere iki fonksiyona sahiptir. "report" fonksiyonu oluşan hataları "log" dosyasına yazmak ya da "Bugsnag" ya da "Sentry" gibi servislere göndermek için kullanılmaktadır "report" fonskiyonunu kullanarak farklı istediğiniz hatalar için farklı raporlarma türleri kullanabilirsiniz. "CustomException" hatası için örnek kullanım.


Report Fonksiyonu

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

    return parent::report($exception);
}


Bazı durumlarda hata oluşmasına rağmen, hatanın kayıt altına alınarak işlemlerin devam etmesini isteyebilirsiniz. Bunun için aşağıdaki yardımcı fonksiyonu (helper function) kullanabilirsiniz.

public function isValid($value)
{
    try {
        // Validate the value...
    } catch (Exception $e) {
        report($e);

        return false;
    }
}


Bazı hatalar için kayıt "log" dosyasına yazılmamasını isteyebilirsiniz. Bu durumda bu hataların "$dontReport" dizisi içinde tanımlanası gerekmektedir. Örnek kullanım,

protected $dontReport = [
    \Illuminate\Auth\AuthenticationException::class,
    \Illuminate\Auth\Access\AuthorizationException::class,
    \Symfony\Component\HttpKernel\Exception\HttpException::class,
    \Illuminate\Database\Eloquent\ModelNotFoundException::class,
    \Illuminate\Validation\ValidationException::class,
];


Render Fonksiyonu


Render fonksiyonu ile hata oluşması durumunda kullanıcıya gönderilecek olan cevap (response) üzerinde değişiklikler yapabiliriz.  Örneğin, "CustomException" oluştuğunda kullanıcya istediğimiz hata mesajını gönderebiliriz. Örnek kullanım,

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

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


Yukarıdaki örneklerde mevcut olan "render" ve "report" fonksiyonlarını değiştirerek işlem yaptık. Fakat kendimiz de "Exception" sınıfı oluşturarak bu oluşturduğumuz "Exception" sınıfı içerisinde "report" ve "render" fonksiyonlarını tanımlayabiliriz. Bir "exception" sınıfı oluşturmak için aşağıdaki komutu kullanabilirsiniz.

php artisan make:exception CustomException


Bu şekilde "app\Exceptions\CustomException.php" dosyasının oluştuğunu göreceksiniz. Bu dosya üzerinde aşağıdaki şekilde "report" ve "render" fonskiyonlarını tanımlayarak kullanabiliriz.

namespace App\Exceptions;

use Exception;

class CustomException extends Exception
{
    /**
     * Report the exception.
     *
     * @return void
     */
    public function report()
    {
        //
    }

    /**
     * Render the exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        return response(...);
    }
}


HTTP Hataları (Exceptions)

Bazı hataları HTTP hata kodları ile tanımlıyabiliriz. Örneğin, 404 sayfa bulunamadı. 401 yetki hatası gibi. Bunun için "abort" yardımcı fonksiyonunu kullanabiliriz. Örnek kullanım,

abort(404);


Ayrıca, hata mesajını da belirtebiliriz. Örnek kullanım,

abort(403, 'Unauthorized action.');


HTTP Hata Sayfalarının Özelleştirilmesi

Laravel HTTP hata sayfaları "resources/views/errors/" klasörü altında tutulmaktadır. Örneğin 404 HTTP hatası oluştuğunda bu klasör altında bulunan "404.blade.php" çalışmaktadır. Aynı şekilde 503 HTTP hatası oluştuğunda, yine aynı klasör altındaki "503.blade.php" çalışmaktadır. HTTP hataları için bu klasör altında hata kodları ile yeni hata oluşması durumunda gösterilecek sayfaları tanımlayabilirsiz. Yukarıdaki örnek kullanımda "abort" fonksiyonu ile hata sayfasına hata mesajı gönderme işlemini görmüştük.  Gönderilen bu hata mesajına erişim için "getMessage" fonksiyonu kullanılmaktadır. Örnek kullanım,

abort(403, 'Unauthorized action.');
<h2>{{ $exception->getMessage() }}h2>


Sonuç

Uygulama geliştirmede esnasında oluşan hataların yakalanması, kullanıcıya bilgilendirici ve yönlendirici bilgilerin gösterilmesi önemlidir. Bu makalemde Laravel ile hata yakalama işleminin nasıl yapıldığı, oluşan hataların nasıl kayıt altına alındığı ve kullanıcıya  hata mesajlarının nasıl gönderildiğini anlattım. Ayrıca, kendi hata yakalam sınıfınızı nasıl oluşturabileceğinize ve HTTP hata kodlarını nasıl yakalayıp, kullanıcıya gösterildiğine değindim.


Karşılaştığınız sorunları bana mesaj yoluyla sorabilirsiniz.
Umarım faydalı olur. İyi çalışmalar.


Makaleyi faydalı buldunuz mu ?

Yazar


Legend Engineer

Legend Engineer

Mühendis (Bilgisayar)

Bilgisayar Mühendisliği mezunuyum. Bilgisayar alanında edindiğim bilgileri bu blog üzerinde paylaşıyorum. Beni takipte kalın.

Yorumlar


İlk yorum yapan sen ol

İlginizi Çekebilir

Makale Hakkındaki Düşünçelerinizi Paylaşın