2012-06-05 2 views
2

PHP의 unlink()이 기본적으로 예외를 지원하지 않기 때문에 이에 대한 래퍼 함수를 ​​만들고 있습니다. 주어진 파일이 존재하지 않기 때문에 삭제할 수 없으면 FileNotFoundException을 던져야합니다.PHP에서 특정 오류를 정확하게 식별하는 방법은 무엇입니까?

이 경우 unlink()이 던진 오류가 파일 누락 등으로 인해 발생했는지 확인해야합니다.

이 사용자 정의에 대한 내 테스트 버전은 기능 삭제할 수 있습니다 : $errLevel 내가 얻을 $errString를 들어

public function deleteFile($path){ 
    set_error_handler(function($errLevel, $errString){ 
     debug($errLevel); 
     debug($errString); 
    }); 
    unlink($path); 
    restore_error_handler(); 
} 

을 (E_WARNING)와 링크 해제 (/ tmp를/fooNonExisting) : 해당 파일이나 디렉토리

오히려 대담한 접근 방식은 다음과 같이 될 것이다 :

if(strpos($errString, 'No such file or directory') !== false) { 
    throw new FileNotFoundException(); 
}; 

질문 1 : 다른 PHP 버전에서 오류 문자열이 얼마나 많이 의존 할 수 있습니까? 질문 2 : 훨씬 좋은 방법이 있습니까?

답변

2

내가 코드를 단순화 것 :

public function deleteFile($path){ 

    if (!file_exists($path) { 
     throw new FileNotFoundException(); 
    }else{ 
     unlink($path); 
    } 

    if (file_exists($path) { 
     throw new FileNotDeleted(); 
    } 
} 

그런 다음 당신이 $errstr을 잡을 필요가 잡는 복잡한 오류를하지 않습니다. 그리고 예외가 도입되었을 때 PHP 4로 작동합니다.

+1

예, 좋은 해결책입니다. 그러나 이것은 잘못된 파일 사용 권한과 같은 다른 모든 유형의 문제도 묻을 것입니다. 차라리 "파일을 찾을 수 없음"을 예외로 변환하고 싶습니다. – pixelistik

+0

나는 내 대답을 업데이트했다. – powtac

+0

'else' 블록에서'unlink()'를 사용하여 솔루션을 수정했습니다 (검토 대기 중). 잘못된'@'부분을 제거 할 수 있습니다. 아마도이 기술을 사용할 것이지만 초기 오류 처리/식별 문제에 대한 다른 대답을 기다리게하십시오. – pixelistik

0

나는 그것이 (예 : 귀하의 코드) 충분히 휴대해야한다고 믿습니다 ... 동일한 일을 성취하는 더 좋은 방법으로, 나는 일을 다르게 할 것입니다. (코드는 간단하지만 읽기 쉽습니다. ... 나와 함께 곰)

function deleteFile($file_path){ 
    if(!is_file($file_path)){ 
     throw new Exception("The path does not seem to point to a valid file"); 
    } 
    if(!file_exists($file_path)){ 
     throw new Exception("File not found!"); 
    } 
    if(unlink($file_path)){ 
     return true; 
    } else { 
     throw new Exception("File deletion failed!"); 
    } 
} 

물론 코드를 압축하고 개선 할 수 있습니다. 물론 도움이됩니다.

0

필자는 PHP 오류 메시지가 꽤 오래 동안 변하는 것을 보았습니다. 어쩌면 매우 세분화 된 코드를 통해 마지막 오류의 변경을 감지 한 다음 매우 느슨한 영지에서 문자열 분석을 시도해보십시오.

$lastErr = error_get_last(); 
unlink($file); 
if ($lastErr !== error_get_last()) { 
    // do something 
    //maybe string parsing and/or testing with file_exists, is_writable etc... 
} 
1

set_error_handler()과 함께 나는 ErrorException 건너 온 questions 내 옛날 읽기 저점이 모든 기본 PHP 오류에 대한 예외 변압기에 자동 오류가 될 것이지만 :

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
unlink('Does not exitsts'); 

수있는 사람 이거 교수 야?

+1

모든 오류에 대해 작동하지 않습니다. 파서 시간 및 시작 오류 외에 치명적인 오류와 같은 다른 런타임 오류는 오류 처리기에서 catch하지 않습니다. –

관련 문제