Như @DmitryRekun đã nói, một cuộc thảo luận tốt ở đây . Mấu chốt cần xem xét trong tất cả những điều này là loại lỗi nào bạn có?
Có hai loại lỗi:
- Có thể phục hồi
- Không thể phục hồi.
Sự khác biệt tôi có xu hướng tổng hợp như sau:
Can I still show the page that was requested, even though this error occurred?
- Vâng? - Có thể phục hồi
- Không? - Không thể phục hồi
Bây giờ chúng tôi biết những gì chúng ta đang đối phó. Những gì bạn nên làm?
Nếu lỗi không thể phục hồi, bạn muốn chuyển hướng chúng đến một trang lỗi thay vì tiếp tục đến trang được yêu cầu . Điều đó đơn giản như sau:
throw new Exception(JText::_('COM_MYCOMP_ERROR_MESSAGE_NOT_FOUND'), 404);
Exception
là một lớp có hai tham số, một thông điệp và một mã. Bạn nên thử sử dụng Mã phản hồi HTTP nếu chúng phù hợp với kịch bản của bạn.
Nếu lỗi có thể phục hồi, có thể bạn chỉ muốn hiển thị thông báo lại cho người dùng cuối trong khi vẫn hiển thị cho họ trang mà họ yêu cầu. Điều này thường có nghĩa là bạn nên 'enqueue' một tin nhắn cho ứng dụng:
JFactory::getApplication()->enqueueMessage($error, 'error');
enqueueMessage
có hai tham số, thông báo lỗi và một loại thông báo. Thêm thông tin ở đây (ở phía dưới).
Ngoài ra còn có một tình huống thứ ba xảy ra khá thường xuyên đối với tôi ít nhất. Joomla sẽ đưa ra các ngoại lệ cho các lỗi khác nhau (chẳng hạn như lỗi truy vấn cơ sở dữ liệu). Điều này có nghĩa là Joomla nghĩ rằng lỗi này là không thể phục hồi. Tuy nhiên, dù sao bạn cũng có thể muốn tiếp tục. (Ví dụ: nếu tôi thay đổi bảng khi cập nhật tiện ích mở rộng của mình, tôi chỉ có thể chạy ALTER
truy vấn, sẽ đưa ra một ngoại lệ nếu bảng đó đã bị thay đổi trước đó.)
Trong trường hợp đó, bạn muốn bọc mã có thể đưa ra một ngoại lệ trong phần thử ... bắt:
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
}
Lưu ý rằng những gì bạn đang làm là "bắt" lỗi không thể phục hồi và buộc hệ thống khôi phục và tiếp tục hiển thị trang được yêu cầu.
Thêm tất cả điều này và trường hợp của bạn sẽ là một lỗi không thể phục hồi. (Tôi biết điều này bởi vì bạn đã 'trả về false' sau đó, vì vậy bạn có thể không có kế hoạch tiếp tục và đang từ bỏ chức năng.)
Vì vậy, tôi sẽ viết lại như sau:
// 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.
}