2011-01-04 25 views
6

मैं एक Django साइट विकसित कर रहा हूं और अपवाद हैंडलिंग करने का सबसे अच्छा तरीका काम करने की कोशिश में परेशानी हो रही है। मैंपायथन अपवाद हैंडलिंग

try: 
    Some code 
except: 
    log error in my own words, i.e 'Some code' failed to execute 
    Some other code 

यह सभी अपवादों को पकड़ता है जिससे यह सुनिश्चित किया जाता है कि मेरी साइट 500 त्रुटियों और इस तरह की नहीं है। लेकिन, मेरे सीमित ज्ञान के साथ मैं वास्तविक अपवाद खो रहा हूं और यह इसे डीबग करने के लिए एक वास्तविक दर्द बना रहा है। मैं उस त्रुटि को कैसे मुद्रित करूं? वर्तमान में मैं कोशिश करता हूं कि कोशिश करें: पकड़ें: और त्रुटि देखें और इसे ठीक करें। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए!

अग्रिम धन्यवाद

रिच

+0

आप "नग्न" 'except' ऐसे ही बयान कहाँ देखा है?क्या आप एक ट्यूटोरियल के लिए उद्धरण या लिंक प्रदान कर सकते हैं जो इस प्रकार के प्रोग्रामिंग को दिखाता है? इसे एक बुरा अभ्यास माना जाता है। मैं जानना चाहता हूं कि आपने यह कहाँ सीखा। –

+4

@ एसएलओटी: इस तरह किसी पर आने के बजाय कुछ वैकल्पिक दृष्टिकोण प्रदान करना बेहतर होगा और समझाया जाए कि इसे खराब अभ्यास क्यों माना जाता है। – magiconair

उत्तर

1

इस प्रयास करें:

try: 
    # some code 
except Exception, e: 
    # Log the exception. 

वहाँ अपवाद स्वरूपित करने के लिए विभिन्न तरीके हैं:

try: 
    // some code 
except Exception, e: 
    // log error with data from e 
15

आप एक अपवाद चर में अपवाद को पकड़ने , लॉगिंग मॉड्यूल (जो मैं आपको/Django उपयोग करता हूं) को excep प्रारूपित करने के लिए समर्थन है टियां, और अपवाद आमतौर पर तारों को प्रस्तुत करते समय उपयोगी संदेश प्रस्तुत करते हैं।

import logging 
logging.basicConfig(level=logging.DEBUG) 
logging.debug('This message should go to the log file') 

try:  
    1/0 
except Exception as e: 
    logging.exception(e) 

यह उदाहरण अपवाद, अजगर 2.6 और बाद में समर्थन को पकड़ने के लिए वाक्य रचना "के रूप में" नए प्रयोग करता है:

यहाँ एक उदाहरण है। इसके बाद के संस्करण के उत्पादन में है:

DEBUG:root:This message should go to the log file 
ERROR:root:integer division or modulo by zero 
Traceback (most recent call last): 
    File "untitled-1.py", line 6, in <module> 
    1/0 
ZeroDivisionError: integer division or modulo by zero 
4
#!/usr/bin/env python 

import sys 

try: 
    0/0 
except Exception, e: 
    print >> sys.stderr, 'Hello %s' % e 
    # Hello integer division or modulo by zero 

ध्यान दें कि आप एक ब्लॉक के लिए कई अपवाद पकड़ कर सकते हैं, जैसे:

try: 
    open(filename) 
except NameError, e: 
    print >> sys.stderr, e 
except IOError, ioe: 
    print >> sys.stderr, ioe 

अपवाद हैंडलिंग के बारे में अधिक इस ट्यूटोरियल में पाया जा सकता है:

1

Django Middleware यह है कि आप Django साइटों में अपवादों को कैसे संसाधित करते हैं।

सभी अपवादों को पकड़ने के लिए, आपको एक Django मिडलवेयर बनाना होगा और एक प्रक्रिया_ अपवाद विधि बनाना होगा।

from django.http import HttpResponse 

class SomeMiddleware(object): 
    def process_exception(self, request, exception): 
     'Intercept exceptions' 

     return HttpResponse('Hey! an error occurred', 
       content_type='text/plain') 

तो आप इसे अपने MIDDLEWARE_CLASSES की स्थापना करने के लिए जोड़ें:

MIDDLEWARE_CLASSES = (
    # ... 
    'some.module.SomeMiddleware', 
) 

तो फिर तुम जब अपवाद के किसी भी प्रकार का सामना कर क्या करना है पर नियंत्रण मिलता है।

मुझे लगता है कि यह आपके प्रश्न का उत्तर देता है। लेकिन आप शायद overriding the 500.html template or the handler500 view से बेहतर हैं। ध्यान दें कि ये विचार तब तक नहीं आते जब तक आप अपनी परियोजना सेटिंग्स में गलत तरीके से DEBUG सेट नहीं करते हैं।

3

इस मदद कर सकते हैं

try: 

    raise Exception('spam', 'eggs') 

except Exception as inst: 

    print type(inst)  # the exception instance 
    print inst.args  # arguments stored in .args 
    print inst   # __str__ allows args to printed directly 
    x, y = inst.args 
    print 'x =', x 
    print 'y =', y 
संबंधित मुद्दे