문제

이 기록에서 PHP 지만,그것은 정말 언어에 구애받지 않습니다.

try
{
    try
    {
        $issue = new DM_Issue($core->db->escape_string($_GET['issue']));
    }
    catch(DM_Exception $e)
    {
        throw new Error_Page($tpl, ERR_NOT_FOUND, $e->getMessage());
    }
}
catch(Error_Page $e)
{
    die($e);
}

중첩 시 catch 블록하는 것이 좋습니다.그것은 보인 작은 부피가 큰 위해 오류페이지-그러나 나의 문제 Datamanager 예외가 발생하면 오류가 발생하고 나가는 것을 고려하는 좋은 방법이 될의 오류를 검출.

이 Error_Page 예외는 것은 단순히 오류가 페이지에 컴파일러입니다.

내가 될 수도 있습니 어렵기만 하지 않기 때문에,하지만 당신은 당신이 생각하는 좋은 방법 오류를 보고하고 그렇다면 추천할 수 있는 더 나은 방법을 쓰는 이?

감사

도움이 되었습니까?

해결책

당신이 사용하는 예외에 대한 페이지의 논리,그리고 나는 개인적으로 생각하지 않는 좋은 것입니다.예외를 사용해야 신호를 때 나쁜 또는 예기치 못한 일이 일어날지의 출력을 제어하는 오류 메시지가 나타납니다.당신이 원하는 경우를 생성하는 오류를 기반으로 페이지 예외 사용하십시오 set_exception_handler.어떤 포착되지 않는 예외를 실행을 통해 어떤 방법을 콜백을 지정합니다.계속 마음이 멈추지 않는다"fatalness"의 예외입니다.후에는 예외로 전달을 통해 귀하의 콜백을 실행이 중지됩니다 다음과 같이 정상 후에도 포착되지 않는 예외는 아니다.

다른 팁

나는 당신이 더 나을 것이 없습니다 중첩이 있습니다.기대할 경우에는 예외 여러 종류,여러 개를 잡는다.

try{
  Something();
}
catch( SpecificException se )
{blah();}
catch( AnotherException ae )
{blah();}

이상은 대한 예외를 잡은 수준에서는 그들을 처리할 수 있습니다.지 전(시간 낭비),그리고 후(당신을 잃 컨텍스트).

경우에 따라서,$tpl 및 ERR_NOT_FOUND 는 정보는 단지"로 알려진"가까이 새로운 DM_Issue 전화,예를 들어 있기 때문에 다른 장소를 만들 DM_Issue 고 원하는 것이 ERR_SOMETHING_ELSE 나기 때문에 값$tpl 따라 다릅니다,당신은길을 끄는 첫 번째 예외가 바로 이곳에 있습니다.

는 방법에서 얻을하는 장소 죽어가는 또 다른 질문입니다.대체하는 것이 죽는 바로 거기에 있습니다.하지만 당신은 그렇게 할 경우 다음이 없는 기회를 위한 개입을 하는 코드는 아무것도(과 같은 삭제가 어떤 방법으로 수정 또는 오류 페이지)후에 오류가기 전에 종료됩니다.그것은 또한 좋은 명시적으로 제어할 수 있 흐름입니다.그래서 나는 당신이 좋습니다.

나는 가정의 예가 아닌 완전한 응용 프로그램-는 경우 그 다음 그것은 아마 불필요한 자세한 정보,그리고 당신은 그냥 죽 DM_Exception catch 절입니다.하지만 실제 응용 프로그램의 힘의 원칙이 단지에서 죽어가는 중이다.

필요에 따라 이용할 수 있습니다.지만,나는 일반적으로 상당히 주저하게 잡을 예외로,랩 메시지에서 새 예외를 다시 발생시키기 때문에 당신이 그것을 느슨한 스택 추적(및 기타 잠재적으로)정보에서 원래의 예외에 포장 예외는 아니다.당신 확인 당신이 필요로 하지 않는 정보를 검토할 때 감싸는 예외는 다음의 것이 좋습니다.

나에 대한 확실하지 않 PHP 지 예:C#할 수 있 다음 중 하나를 잡을록 할 필요가 없도록에 대한 중첩된 try/catch-합니다.

일반적으로 믿는 errorhandling 으로 시도/catch/마지막으로 항상 일반적인 상식도 보여주기를 위한"오직"이는 오류 페이지입니다.그것은 깨끗한 방법으로 오류 처리하고 방지하는 이상한 행동에 충돌하고 있습니다.

난 이는 문제되지 않을 발견-그것은 유효한 상태의 응용 프로그램,그리고 당신이 필요하지 않 스택 추적을 표시 404.

당신은 무엇을 잡을 필요가가치 실패처럼,sql 오류를는 경우는 예외 처리에 유용합니다.나의 코드를 더 다음과 같다:

try {
    $issue = DM_Issue::fetch($core->db->escape_string($_GET['issue']));
}
catch (SQLException $e) {
    log_error('SQL Error: DM_Issue::fetch()', $e->get_message());
}
catch (Exception $e) {
    log_error('Exception: DM_Issue::fetch()', $e->get_message());
}

if(!$issue) {
    display_error_page($tpl, ERR_NOT_FOUND);
}
else
{
    // ... do stuff with $issue object.
}

예외를 사용해야 하는 경우에만 있는 잠재적으로는 사이트를 깨고 이벤트 같은 데이터베이스 쿼리로 실행하지 않을 제대로 무언가 잘못 구성되었습니다.좋은 예를 들어는 캐쉬하거나 로그 디렉토리에 쓰기권한이 없는 아파치 프로세스.

여기에서 아이디어는 예외는 당신을 위해,개발자,중단할 수 있는 코드를 끊은 전체 사이트할 수 있도록 그들을 해결 하기 전에 배포합니다.그들은 또한 정신지 확인하는 경우 환경 변화(예:누군가가 변경 권한을 캐시 폴더 또는 변경 데이터베이스 방식)사이트가 중단되기 전에 손상을 줄 수 있습니다.

그래서,아;중첩된 잡는 핸들러는 좋은 생각이 아니다.에 내 페이지,나 index.php 파일 랩 코드에도...캐시 차단 및면 뭔가 나쁜 일부를 확인하면 그것의 생산 또는 아닙니다;거나 이메일을 나에게 표시 일반적인 오류가 페이지,또는 오류를 표시 화면 오른쪽에.

기억하십시오:PHP 지 않습니다.C#은(제외하고(다 아닙니다:p)의 ASP.net 위해)응용 프로그램을 포함하는 국가는 반면 PHP 는 무국적자 스크립트 언어입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top