2013-07-09 17 views
7

मैं PHP में अपवादों के साथ खेल रहा हूं। उदाहरण के लिए, मेरे पास एक स्क्रिप्ट है जो $ _GET अनुरोध पढ़ती है और फ़ाइल लोड करती है; फ़ाइल मौजूद नहीं है, तो एक नया अपवाद उत्पन्न किया जाना चाहिए:PHP घातक त्रुटि: अपवाद अपवाद 'अपवाद'

if (file_exists($_SERVER['DOCUMENT_ROOT'] .'/'.$_GET['image'])) { 
    // Something real amazing happens here. 
} 
else { 
    throw new Exception("The requested file does not exists."); 
} 

समस्या यह है कि, जब मैं परीक्षण के लिए एक गैर विद्यमान फ़ाइल देने की कोशिश करते हैं, मैं बजाय एक 500 त्रुटि अपवाद संदेश मिला । सर्वर लॉग निम्न है:

[09-Jul-2013 18:26:16 UTC] PHP Fatal error: Uncaught exception 'Exception' with message 'The requested file does not exists.' in C:\sites\wonderfulproject\script.php:40 
Stack trace: 
#0 {main} 
    thrown in C:\sites\wonderfulproject\script.php on line 40 

मुझे आश्चर्य है कि मुझे यहां कुछ वास्तविक याद आ रही है।

मैंने इस प्रश्न को PHP fatal error: Uncaught exception 'Exception' with message पर देखा है, लेकिन यह मेरी समस्या की तरह नहीं है, और कोई संक्षिप्त जवाब नहीं है।

सहायता, कृपया?

* संपादित करें *

यह throw कीवर्ड से संबंधित यह कुछ है लगता है। उदाहरण के लिए, यदि मैं echo का उपयोग करता हूं, तो मुझे स्क्रीन पर मुद्रित संदेश मिला, जैसे:

संदेश के साथ अपवाद 'अपवाद' फ़ाइल मौजूद नहीं है। सी में: \ sites \ wonderfulproject \ script.php: 183 स्टैक ट्रेस: ​​# 0 {मुख्य}

वह क्यों है? @Orangepill को

** संपादित 2 **

धन्यवाद, मैं अपवाद को संभालने के लिए के बारे में एक बेहतर समझ मिल गया। और मुझे nettuts से एक शानदार टट मिला जो बहुत मदद की। लिंक: http://net.tutsplus.com/tutorials/php/the-ins-and-outs-of-php-exceptions/

+3

आपका लॉग आपको बिल्कुल बताता है कि आप क्या कहना चाहते थे, समस्या क्या है? –

+1

'file_exists' स्पष्ट रूप से 'झूठी' लौटा, संभवतः क्योंकि फ़ाइल वास्तव में * अस्तित्व में नहीं है। – deceze

+0

@DanyCaissy मुद्दा यह है कि मुझे अपने संदेश और स्क्रीन में स्टैक ट्रेस के साथ अपवाद होने के बजाय 500 - आंतरिक सर्वर त्रुटि मिल रही है। – darksoulsong

उत्तर

20

यह प्रदर्शन_एरर्स के साथ एक अपरिचित अपवाद के लिए व्यवहार की उम्मीद है।

यहां आपके विकल्प php के माध्यम से या ini फ़ाइल में display_errors चालू करने या अपवाद को पकड़ने और आउटपुट करने के लिए हैं।

ini_set("display_errors", 1); 

या

try{ 
    // code that may throw an exception 
} catch(Exception $e){ 
    echo $e->getMessage(); 
} 

आप अपवाद फेंक रहे हैं, तो इरादा है कि कहीं और नीचे लाइन कुछ को पकड़ने और इसके साथ सौदा होगा। यदि नहीं, तो यह एक सर्वर त्रुटि (500) है।

आपके लिए एक और विकल्प आपकी स्क्रिप्ट के लिए डिफ़ॉल्ट त्रुटि हैंडलर सेट करने के लिए set_exception_handler का उपयोग करना होगा।

function default_exception_handler(Exception $e){ 
      // show something to the user letting them know we fell down 
      echo "<h2>Something Bad Happened</h2>"; 
      echo "<p>We fill find the person responsible and have them shot</p>"; 
      // do some logging for the exception and call the kill_programmer function. 
} 
set_exception_handler("default_exception_handler"); 
+0

अच्छा। लेकिन मैंने सोचा कि मैं एक कोशिश पकड़ ब्लॉक के बाहर अपवाद फेंक सकता हूं, अगर मैं गलत हूं तो मुझे सही करें। मैंने अपने प्रश्न को एक नए विवरण के साथ अपडेट किया है जो मैंने कोशिश की है। – darksoulsong

+0

आप कर सकते हैं ... लेकिन आपको 500 सर्वर संदेश मिलेगा:) .... खुद को पकड़ने और उससे निपटने का मौका देने के अलावा अपवाद फेंकने में कोई बात नहीं है, या कम से कम एक सूचनात्मक "ओप्स" यदि अपवाद पुनर्प्राप्त करने योग्य नहीं है तो अंतिम उपयोगकर्ता के लिए पृष्ठ। – Orangepill

+0

कोशिश/पकड़ को उस फ़ंक्शन में होना जरूरी नहीं है जो अपवाद को फेंक देता है, यह निष्पादन स्टैक में और भी नीचे हो सकता है ... जैसे कि उस फ़ंक्शन के कॉलर में, या वह फ़ंक्शंस कॉलर। – Orangepill

7

किसी के पास एक ही समस्या होने पर बस कुछ अतिरिक्त जानकारी जोड़ना।

मैं अपने कोड में नेमस्पेस का उपयोग करता हूं और मेरे पास एक ऐसा कार्य था जिसमें एक अपवाद फेंकता है।

हालांकि किसी अन्य वर्ग फ़ाइल में मेरी कोशिश/पकड़ कोड पूरी तरह अनदेखा कर दिया गया था और एक अनचाहे अपवाद के लिए सामान्य PHP त्रुटि फेंक दी गई थी।

बाहर निकला मैं "उपयोग \ अपवाद" जोड़ने के लिए भूल गया; शीर्ष पर, जोड़ना कि त्रुटि हल।

+1

या आप कक्षा में कॉल में पथ को परिभाषित कर सकते हैं: नया \ अपवाद (...) फेंक दें; रूट पर वर्ग के पथ को परिभाषित करने के लिए अग्रणी "\" को नोट करें। – DeeZone

+0

धन्यवाद मेरी समस्या को हल करने के लिए @ xorinzor! मैं पागल हो रहा था ... – Joe

0

लिए

throw new Exception('test exception'); 

जब तक मैं (सिर्फ एक सबफ़ोल्डर के लिए) मेरे .htaccess में

php_flag display_errors on 

डाल मैं 500 हो गया है (लेकिन ब्राउज़र में कुछ नहीं देखा),। और भी विस्तृत सेटिंग्स हैं, देखें Enabling error display in php via htaccess only

संबंधित मुद्दे