@ DmitryRekun'un dediği gibi, burada iyi bir tartışma var . Tüm bunlarda göz önünde bulundurulması gereken anahtar parça ne tür bir hatanız var?
İki tür hata vardır:
- geri alınabilir
- Kurtarılamayan.
Farkı şöyle özetliyorum:
Can I still show the page that was requested, even though this error occurred?
- Evet? - Kurtarılabilir
- Yok hayır? - Kurtarılamaz
Şimdi neyle uğraştığımızı biliyoruz. Ne yapmalısın?
Hata düzeltilemezse, istenen sayfaya devam etmek yerine bir hata sayfasına yönlendirmek istersiniz . Bu, aşağıdakiler kadar basittir:
throw new Exception(JText::_('COM_MYCOMP_ERROR_MESSAGE_NOT_FOUND'), 404);
Exception
ileti ve kod olmak üzere iki parametre alan bir sınıftır. Senaryonuza uyuyorsa HTTP Yanıt Kodlarını kullanmaya çalışmanız önerilir .
Hata giderilebilirse, büyük olasılıkla istedikleri sayfayı göstermeye devam ederken son kullanıcıya bir mesaj görüntülemek isteyebilirsiniz. Bu genellikle uygulama için bir mesajı 'sıralamanız' gerektiği anlamına gelir:
JFactory::getApplication()->enqueueMessage($error, 'error');
enqueueMessage
hata mesajı ve mesaj türü olmak üzere iki parametre alır. Daha fazla bilgi burada (altta).
En azından benim için oldukça sık görülen üçüncü bir durum daha var. Joomla, farklı hatalar (veritabanı sorgu hatası gibi) için istisnalar atacaktır. Bu, Joomla'nın bu hatanın düzeltilemez olduğunu düşündüğü anlamına gelir. Ancak yine de devam etmek isteyebilirsiniz. (Örneğin, uzantımın güncelleştirilmesiyle ilgili bir tabloyu değiştirirsem, ALTER
sorguyu çalıştırabilirim; bu, tablo önceden değiştirilmişse bir istisna atar.)
Bu durumda, bir try ... catch bölümünde bir istisna oluşturabilecek kodu sarmak istersiniz:
try {
// exception generating code
throw new Exception('Normally you would have other code that calls a class that throws the exception', 500);
} catch (Exception $e) {
$msg = $e->getMessage(); // Returns "Normally you would have other code...
$code = $e->getCode(); // Returns '500';
JFactory::getApplication()->enqueueMessage($msg, 'error'); // commonly to still display that error
}
Yaptığınız şeyin kurtarılamaz hatayı "yakalamak" olduğunu ve sistemi kurtarmaya ve istenen sayfayı göstermeye devam etmeye zorladığını unutmayın.
Tüm bunları toplayın ve durumunuz kurtarılamaz bir hata olmalıdır. (Bunu biliyorum çünkü daha sonra `` yanlış dönüş '' yaptınız, bu yüzden devam etmeyi planlamıyorsunuz ve işlevden vazgeçiyorsunuz.)
Böylece bunu şu şekilde yeniden yazarım:
// Check for errors.
if (count($errors = $this->get('Errors')))
{
throw new Exception(implode("\n", $errors), 500);
return false; // you can remove this too, technically since the exception will take you out of this function.
}