2009-05-29 2 views
15

PHP의 mkdir 함수는 true와 false만을 반환합니다. 문제는 false를 반환 할 때입니다.mkdir가 PHP에서 실패 할 때 이유를 찾는 방법은 무엇입니까?

오류보고를 사용하는 상태에서 실행 중이면 화면에 오류 메시지가 표시됩니다. 아파치 로그에서 오류 메시지를 볼 수도 있습니다. 그러나 나는 메시지의 텍스트를 잡고 그것을 가지고 뭔가 다른 것을하고 싶다. (예를 들면 IM을 통해 나에게 보낸다.) 오류 텍스트를 얻으려면 어떻게해야합니까?

업데이트 : 아이 만의 생각에 따라, 내가 여기에 온 : 그것은 전역 변수를 사용하기 때문에

function error_handler($errno, $errstr) { 
    global $last_error; 
    $last_error = $errstr; 
} 

set_error_handler('error_handler'); 
if (!mkdir('/somedir')) 
    echo "MKDIR failed, reason: $last_error\n"; 
restore_error_handler(); 

그러나, 나는 그것을 좋아하지 않아. 더 깔끔한 솔루션에 대한 아이디어가 있습니까? error_get_last()

+0

Soulmerge의 대답은 더 나은 선택이다 핸들러를 교체하지 않고 오류에 대해 알려주기 때문입니다. –

+4

오류 처리기는 PHP의 스택에 저장되므로 restore_error_handler()를 호출하면 내장 오류 처리기 또는 다른 사용자 정의 처리기인지 여부에 관계없이 이전 오류 처리기가 복원됩니다. 따라서 오류 처리기를 set_error_handler()로 일시적으로 대체하는 데 손실이 없습니다. – soulmerge

답변

42

당신은 suppress the warning 및 수 사용 :

if ([email protected]($dir)) { 
    $error = error_get_last(); 
    echo $error['message']; 
} 
+5

+1하지만 mkdir()과 error_get_last() 사이에 또 ​​다른 오류가 발생하면 코드가 복잡해질 때 발생할 수있는 오류 (예 : 극단적 인 비현실적인 예, 틱 기능이 실행될 수있는 오류 및 error_get_last() 호출 전에 오류를 생성하십시오.) 어떤 종류의 get-last-error 함수를 사용할 때마다 항상 위험합니다. –

14

당신이 사용할 수있는 예외 : 일부 코드 그래서 같은

설정 : 다음

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

그리고는 수행

try { 
    mkdir('/somedir'); 
} catch(ErrorException $ex) { 
    echo "Error: " . $ex->getMessage(); 
} 

그게 당신이 원하는대로해야합니다. 당신이 PHP 오류 처리기를 유지하려면

, 그 시도의 catch 블록 후 바로 전화 :

restore_error_handler() 
+0

+1 이 방법이 마음에 들지만 테스트하지는 않았지만 견고한 느낌입니다. 또한 더 친숙 해 보인다;) –

+2

또한 PHP의 OO 라이브러리는이 모든 것을 훨씬 잘 처리한다. http://www.php.net/manual/en/class.splfileobject.php –

+1

@nickfox mkdir은 예외를 던지지 않는다. 이것이 예외를 throw하는 사용자 지정 오류 처리기의 이유입니다. PHP의 OO 라이브러리에 관해서는 그렇습니다. – Kazar

3

내가 좋아하는 뭔가를 사용하여 다음

if(! @mkdir('$fileLocation', 0777, $recursive = true)){ 
    $mkdirErrorArray = error_get_last(); 
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1); 
} 
관련 문제