İstisna İşleme
Yapılandırma
config/exception.php
return [
// İstisna işleme sınıfını burada yapılandırın
'' => support\exception\Handler::class,
];
Çoklu uygulama modunda her uygulama için ayrı ayrı istisna işleme sınıfı yapılandırabilirsiniz. Çoklu Uygulama bölümüne bakınız.
Varsayılan İstisna İşleme Sınıfı
webman'de istisnalar varsayılan olarak support\exception\Handler
sınıfı tarafından işlenir. Varsayılan istisna işleme sınıfını değiştirmek için config/exception.php
yapılandırma dosyasını değiştirebilirsiniz. İstisna işleme sınıfı Webman\Exception\ExceptionHandlerInterface
arayüzünü uygulamak zorundadır.
interface ExceptionHandlerInterface
{
/**
* Günlüğe kaydet
* @param Throwable $e
* @return mixed
*/
public function report(Throwable $e);
/**
* Yanıtı oluştur
* @param Request $request
* @param Throwable $e
* @return Response
*/
public function render(Request $request, Throwable $e) : Response;
}
Yanıt Oluşturma
İstisna işleme sınıfı içindeki render
yöntemi yanıtı oluşturmak için kullanılır.
Eğer config/app.php
yapılandırma dosyasında debug
değeri true
ise (kısaca app.debug=true
), ayrıntılı istisna bilgileri döndürülür, aksi halde kısa istisna bilgilerini döndürür.
Eğer istemci isteği JSON yanıt bekliyorsa, istisna bilgisi JSON formatında döndürülür, benzer şekilde:
{
"code": "500",
"msg": "İstisna Bilgisi"
}
Eğer app.debug=true
ise, JSON verilerine ayrıca detaylı çağrı yığını (trace
) alanı eklenir.
Varsayılan istisna işleme mantığını değiştirmek için kendi istisna işleme sınıfınızı yazabilirsiniz.
İş İstisnaları BusinessException
Bazen iç içe geçmiş bir fonksiyonda isteği sonlandırmak ve istemciye bir hata ileti döndürmek isteyebiliriz, bu durumda bunu yapmak için BusinessException
fırlatabiliriz.
Örneğin:
<?php
namespace app\controller;
use support\Request;
use support\exception\BusinessException;
class FooController
{
public function index(Request $request)
{
$this->chackInpout($request->post());
return response('hello index');
}
protected function chackInpout($input)
{
if (!isset($input['token'])) {
throw new BusinessException('Parametre Hatası', 3000);
}
}
}
Yukarıdaki örnek aşağıdakini döndürecektir:
{"code": 3000, "msg": "Parametre Hatası"}
Not
İş istisnası BusinessException yakalanması gerekmeyen bir durumdur, çerçeve otomatik olarak yakalar ve isteğin türüne göre uygun çıktıyı döndürür.
Özel İş İstisnaları
Eğer yukarıdaki yanıt sizin gereksinimlerinize uymuyorsa, örneğin msg
yerine message
yazmak istiyorsanız, MyBusinessException
adında özel bir istisna sınıfı oluşturabilirsiniz.
app/exception/MyBusinessException.php
dosyasını aşağıdaki içerikle oluşturun:
<?php
namespace app\exception;
use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;
class MyBusinessException extends BusinessException
{
public function render(Request $request): ?Response
{
// JSON isteği JSON veri döndürür
if ($request->expectsJson()) {
return json(['code' => $this->getCode() ?: 500, 'message' => $this->getMessage()]);
}
// JSON olmayan istek bir sayfa döndürür
return new Response(200, [], $this->getMessage());
}
}
Böylece iş mantığı
use app\exception\MyBusinessException;
throw new MyBusinessException('Parametre Hatası', 3000);
çalıştığında, JSON isteği aşağıdaki gibi bir JSON yanıt alacaktır:
{"code": 3000, "message": "Parametre Hatası"}
İpucu
BusinessException istisnası, öngörülebilir bir iş istisnası olduğu için çerçeve onu ölümcül bir hata olarak kabul etmez ve günlüğe kaydetmez.
Sonuç
Mevcut isteği sonlandırıp istemciye bilgi döndürmek istediğiniz her durumda BusinessException
istisnasını kullanmayı düşünebilirsiniz.