2011-11-24 12 views
8

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

require('fileERROR.php5') or die("Unable to load configuration file."); 

error_reporting(0) का उपयोग करके सभी त्रुटि संदेश दबाकर केवल एक सफेद स्क्रीन देता है, error_reporting का उपयोग नहीं कर पीएचपी-त्रुटियाँ, जो मैं दिखाने के लिए नहीं करना चाहते हैं देता है।

उत्तर

3

एक बेहतर तरीका पथ पर पहले realpath का उपयोग करना होगा। realpathfalse वापस करेगा यदि फ़ाइल मौजूद नहीं है।

$filename = realpath(getcwd() . "/fileERROR.php5"); 
$filename && return require($filename); 
trigger_error("Could not find file {$filename}", E_USER_ERROR); 

तुम भी में अपने स्वयं के समारोह की आवश्यकता होती है बना सकते हैं यदि आपके ऐप की namespace PHP के आवश्यकता समारोह

namespace app; 

function require_safe($filename) { 
    $path = realpath(getcwd() . $filename); 
    $path && return require($path); 
    trigger_error("Could not find file {$path}", E_USER_ERROR); 
} 

लपेटता है कि अब आप अपनी फ़ाइलों में कहीं भी उपयोग कर सकते हैं

namespace app; 

require_safe("fileERROR.php5"); 
+0

मुझे बिल्कुल नहीं पता कि क्यों, लेकिन आपका कोड सही ढंग से काम नहीं करता है (झूठी सकारात्मक उत्पन्न करता है), जब PHP सीएलआई/कंसोल में चलाएं। अर्थात। यह स्क्रिप्ट के निष्पादन को रोकता है, दावा करता है कि फ़ाइल XYZ मौजूद नहीं है, जबकि यह वास्तव में मौजूद है - अपने कोड को टिप्पणी कर रहा है और सीधे 'शामिल()' ठीक काम करता है और फ़ाइल त्रुटियों के बिना शामिल है। – trejder

1

मेरा सुझाव है आपने set_error_handler() फ़ंक्शन के लिए दस्तावेज़ में सबसे अधिक recent comment पर एक नज़र डाली।

यह एक विधि (और एक उदाहरण के साथ) घातक त्रुटियों को पकड़ने के रूप में निम्नलिखित सुझाव देती है:

<?php 
function shutdown() 
{ 
    $a=error_get_last(); 
    if($a==null) 
     echo "No errors"; 
    else 
     print_r($a); 

} 
register_shutdown_function('shutdown'); 
ini_set('max_execution_time',1); 
sleep(3); 
?> 

मैं सुझाव प्रयास नहीं किया है, लेकिन इस propably अन्य गंभीर त्रुटि स्थितियों में इस्तेमाल किया जा सकता।

+0

हालांकि यह काम कर सकता है, यह अच्छा सवाल पैदा करता है, अगर यह परिस्थितियों में काम करेगा, ओपी पूछ रहा है? मेरा मानना ​​है कि यहां लैंडिंग वाले अधिकांश लोग समाधान ढूंढ रहे हैं, जहां वे गैर-मौजूदा फ़ाइल ** पर 'आवश्यकता' पकड़ सकते हैं और ** स्क्रिप्ट निष्पादन जारी रख सकते हैं। कृपा से मरने में सक्षम होने के नाते (यानी कुछ प्रदर्शित करें, मैं चाहता हूं लेकिन स्क्रिप्ट समाप्ति के साथ समाप्त हो गया - और यही वह कोड है जो आपका कोड कर रहा है) कई परिदृश्यों में फिट नहीं लग रहा है। मुझे लगता है कि स्क्रिप्ट प्रदर्शित हो सकती है, चाहे वह मर जाए।मैं 'आवश्यक' को खिलाए गए गैर-मौजूदा फाइल पर मरने/समाप्ति को रोकना चाहता हूं। – trejder

0

आपको शामिल करने की आवश्यकता है()। आवश्यकता(), जब अस्तित्वहीन फ़ाइल पर उपयोग किया जाता है, एक घातक त्रुटि उत्पन्न करता है और स्क्रिप्ट से बाहर निकलता है, इसलिए आपका मर() नहीं होगा। शामिल करें() केवल चेतावनी फेंकता है और फिर स्क्रिप्ट जारी है।

+0

आपका उत्तर या तो एक निश्चित PHP संस्करण के लिए विशिष्ट है या कुछ 'php.ini' कॉन्फ़िगरेशन के लिए विशिष्ट है। मेरी तरफ से (PHP 5.5.4) मेरी कॉन्फ़िगरेशन के साथ, 'आवश्यकता' को 'शामिल' करने के लिए बदलना बिल्कुल कोई फर्क नहीं पड़ता। दोनों बदसूरत घातक त्रुटियों को फेंक रहे हैं, कि मैं पकड़ नहीं सकता। – trejder

11

आप के साथ set_error_handler का उपयोग करके इसे पूरा कर सकते हैं।

ErrorException पेज से उदाहरण

है:

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

/* Trigger exception */ 
strpos(); 
?> 

आप की तरह कुछ कर सकते हैं एक बार आप त्रुटियों अपवाद के रूप में संभाला जा रहा है:

<?php 
try { 
    include 'fileERROR.php5'; 
} catch (ErrorException $ex) { 
    echo "Unable to load configuration file."; 
    // you can exit or die here if you prefer - also you can log your error, 
    // or any other steps you wish to take 
} 
?> 
+0

@SajnEvardsson php मैन्युअल में त्रुटि अपवाद तीसरा पैरामीटर $ errno के रूप में है, दूसरा नहीं। – Basit

+2

ऊपर दिया गया उदाहरण सीधे "त्रुटि" लिंक में त्रुटि अपवाद दस्तावेज़ (ऊपर लिंक) से कॉपी किया गया है - "$" के रूप में वे $ errno का उपयोग करते हैं, जबकि अन्य (उस पृष्ठ पर टिप्पणियों सहित) ने इसे $ गंभीरता के रूप में उपयोग करने का सुझाव दिया है - नोट अगर आप चाहें तो आप इसे दोनों या न तो दोनों के लिए उपयोग कर सकते हैं। –

6

मैं बस का उपयोग करें 'file_exists()':

if (file_exists("must_have.php")) { 
    require "must_have.php"; 
} 
else { 
    echo "Please try back in five minutes...\n"; 
} 
संबंधित मुद्दे