@DmitryRekun이 말했듯이 좋은 토론이 여기 있습니다 . 이 모든 것에서 고려해야 할 핵심은 어떤 유형의 오류입니까?
두 가지 유형의 오류가 있습니다.
- 복구 가능
- 회복 불가능합니다.
차이점은 다음과 같이 요약됩니다.
Can I still show the page that was requested, even though this error occurred?
이제 우리가 다루고있는 것을 알았습니다. 어떻게해야합니까?
오류를 복구 할 수없는 경우 요청 된 페이지를 계속 진행하는 대신 오류 페이지로 리디렉션하려고 합니다 . 다음과 같이 간단합니다.
throw new Exception(JText::_('COM_MYCOMP_ERROR_MESSAGE_NOT_FOUND'), 404);
Exception
메시지와 코드라는 두 가지 매개 변수를 취하는 클래스입니다. 시나리오에 맞는 HTTP 응답 코드 를 사용하는 것이 좋습니다 .
오류가 복구 가능한 경우 최종 사용자에게 메시지를 표시하면서 요청한 페이지를 계속 표시하려고 할 수 있습니다. 이것은 일반적으로 응용 프로그램에 대한 메시지를 '인큐'해야 함을 의미합니다.
JFactory::getApplication()->enqueueMessage($error, 'error');
enqueueMessage
오류 메시지와 메시지 유형의 두 매개 변수를 사용합니다. 자세한 내용은 여기 (아래)를 참조하십시오.
적어도 나에게 꽤 자주 발생하는 세 번째 상황도 있습니다. Joomla는 다른 오류 (예 : 데이터베이스 쿼리 오류)에 대한 예외를 발생시킵니다. 이것은 Joomla가이 오류를 복구 할 수 없다고 생각한다는 것을 의미합니다. 그러나 어쨌든 계속하고 싶을 수도 있습니다. 예를 들어, 내 확장 업데이트시 테이블을 변경하는 ALTER
경우 테이블을 이전에 변경 한 경우 쿼리를 실행하면 예외가 발생합니다.
이 경우 try ... catch 섹션에서 예외를 발생시킬 수있는 코드를 래핑하려고합니다.
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
}
수행중인 작업은 복구 할 수없는 오류를 "잡기"하고 시스템이 복구되어 요청 된 페이지를 계속 표시하도록하는 것입니다.
이 모든 것을 합하면 사건은 복구 할 수없는 오류가되어야합니다. (나중에 '거짓을 반환'했기 때문에 이것을 알고 있으므로 계속 계획하지 않고 기능을 포기할 것입니다.)
따라서 다음과 같이 다시 작성합니다.
// 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.
}