2009-05-29 15 views
15

PHP का mkdir फ़ंक्शन केवल सत्य और गलत लौटाता है। समस्या तब होती है जब यह झूठी होती है।mkdir PHP से विफल होने पर कोई कारण कैसे ढूंढें?

यदि मैं त्रुटि रिपोर्टिंग सक्षम के साथ चल रहा हूं, तो मुझे स्क्रीन पर त्रुटि संदेश दिखाई देता है। मैं अपाचे लॉग में त्रुटि संदेश भी देख सकता हूं। लेकिन मैं संदेश के पाठ को पकड़ना चाहता हूं और इसके साथ कुछ और करना चाहता हूं (उदा। आईएम के माध्यम से खुद को भेजें)। मैं त्रुटि पाठ कैसे प्राप्त करूं?

अद्यतन: अयमान के विचार के बाद, मैं इस के लिए आया था:

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() के बीच कोई अन्य त्रुटि होती है, जो तब हो सकता है जब आपका कोड अधिक जटिल हो (एक चरम, अवास्तविक उदाहरण के रूप में, एक टिक फ़ंक्शन चलाया जा सकता है और अपनी त्रुटि_get_last() कॉल से पहले एक त्रुटि उत्पन्न करें)। जब भी आप किसी भी प्रकार के गेट-एंड-एरर फ़ंक्शन का उपयोग कर रहे हों तो यह हमेशा जोखिम होता है। –

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 त्रुटि हैंडलर सुरक्षित रखना चाहते हैं, तो वह कोशिश कैच ब्लॉक के बाद, बस फोन:

restore_error_handler() 
+0

+1 मुझे यह दृष्टिकोण पसंद है, मैंने इसका परीक्षण नहीं किया है लेकिन यह ठोस लगता है। इसके अलावा यह अधिक अनुकूल है;) –

+2

इसके अलावा, पीएचपी के ओओ पुस्तकालय इस सब चीजों से बहुत बेहतर तरीके से निपटते हैं http://www.php.net/manual/en/class.splfileobject.php –

+1

@nickfox mkdir अपवाद नहीं फेंकता है , यही कस्टम त्रुटि हैंडलर का कारण है जो अपवाद फेंकता है। PHP के ओओ पुस्तकालयों के लिए, हाँ, वे शायद यह बेहतर करते हैं। – Kazar

3

मैं की तरह कुछ का उपयोग करें:

if(! @mkdir('$fileLocation', 0777, $recursive = true)){ 
    $mkdirErrorArray = error_get_last(); 
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1); 
} 
संबंधित मुद्दे