2009-05-29 11 views
15

PHP'nin mkdir işlevi yalnızca doğru ve yanlış döndürür. Sorun yanlış olduğunda döner.mkdir PHP'den başarısız olunca bir neden nasıl bulunur?

Hata raporlaması etkinken koşuyorsam, ekranda hata mesajını görüyorum. Apache günlüğünde de hata mesajını görebiliyorum. Ama mesajın metnini alıp onunla başka bir şey yapmak istiyorum (örn. IM ile kendime gönder). Hata metnini nasıl alabilirim?

Güncelleme: Ayman fikrine ardından, bu geldi: küresel değişkeni kullanması nedeniyle

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(); 

Ancak, ben bunu sevmiyorum. Temiz bir çözüm için bir fikrin var mı? error_get_last() ait

+0

Soulmerge cevabı daha iyi bir seçimdir çünkü işleyiciyi değiştirmeden hatayı size bildirir. –

+4

Hata işleyicilerinin PHP'de bir yığında saklandığını unutmayın; bu, restore_error_handler() işlevinin, yerleşik eylemci veya başka bir özel işleyici olup olmadığına bakılmaksızın önceki hata işleyicisini geri yükleyeceği anlamına gelir. Bu nedenle, hata işleyicisini geçici olarak set_error_handler() ile değiştirirken bir kayıp olmaz. – soulmerge

cevap

42

Sen suppress the warning ve yapabilirsiniz kullanım:

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

+1, ancak kodun daha karmaşık hale gelmesiyle (mesela aşırı, gerçekçi olmayan bir örnek olarak, bir kene işlevi çalıştırabiliyorsa) meydana gelebilecek mkdir() ve error_get_last() arasında bir başka hata oluşursa bunun kırılgan olabileceğine dikkat edin. error_get_last() çağrısından önce bir hata oluşturun. Bu, her tür hata sonrası işlevini kullandığınızda her zaman bir risktir. –

14

Şunları kullanabilirsiniz istisnalar: Bazı kod şöyle

Kurulumu: o zaman

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

Ve yapın:

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

İstediğinizi yapmalı. Eğer php hata işleyicisi korumak istiyorsanız

, o try catch bloğundan sonra, sadece çağrı:

restore_error_handler() 
+0

+1 Bu yaklaşımı beğendim, test etmedim ama sağlam geliyor. Ayrıca daha fazla oo-dostu görünüyor;) –

+2

Ayrıca, PHP'nin OO kütüphaneleri tüm bu şeylerle çok daha iyi anlaşıyor http://www.php.net/manual/en/class.splfileobject.php –

+1

@nickfox mkdir bir istisna atar Özel bir hata işleyicisinin bir istisna atmasına sebep olur. PHP'nin OO kütüphaneleri için evet, muhtemelen bunu daha iyi yaparlar. – Kazar

3

ben gibi bir şey kullanmak aşağıdaki:

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