2012-10-25 9 views
9

क्या कोई मुझे इस Django मिडलवेयर में प्राप्त चेतावनी के पीछे वास्तविक कारण बता सकता है, और मैं इसे कैसे हल कर सकता हूं?बहिष्करण चेतावनी: बेसएक्सप्शन.मेसेज को पायथन 2.6 अपवाद के रूप में बहिष्कृत किया गया है .__ वर्ग__, अपवाद। संदेश,

मैं इस संदेश को हो रही है "DeprecationWarning:। BaseException.message अजगर 2.6 अपवाद वर्ग, exception.message, के रूप में पदावनत किया गया है"

class GeneralMiddleware(object): 
    def process_exception(self, request, exception): 
     if exception.__class__ is SandboxError: 
      # someone is trying to access a sandbox that he has no 
      # permission to 
      return HttpResponseRedirect("/notpermitted/") 

     exc_type, value, tb = sys.exc_info() 
     data = traceback.format_tb(
        tb, None) + traceback.format_exception_only(
        exc_type, value) 
     msg = (
      "Failure when calling method:\n" 
      u"URL:'%s'\nMethod:'%s'\nException Type:'%s'\n" 
      u"Error Message '%s'\nFull Message:\n%s" 
      % (request.get_full_path(), request.method, 
       exception.__class__, exception.message, 
+0

'अपवाद के बजाय' इंस्टेंसेंस (अपवाद, सैंडबॉक्स त्रुटि) 'का प्रयास करें .__ class__ SandboxError' है। – Blender

+0

यह मेरे लिए ब्लेंडर काम नहीं करता है ... आपकी तेज प्रतिक्रिया के लिए धन्यवाद। असल में मुझे अपवाद पर चेतावनी मिल रही है .__ class__, अपवाद। इस लाइन को संदेश दें। – PythonDev

उत्तर

24

मैं सही ढंग से, जब अजगर 2.5 में नया उठाने वाक्य रचना का प्रयोग किया, वे पक्ष में message सदस्य से छुटकारा मिला याद है (?) args टुपल का। पिछड़े संगतता के लिए, BaseException.message प्रभावी रूप से BaseException.args[0] if BaseException.args else None जैसा ही है, लेकिन आपको इसे नए कोड में उपयोग नहीं करना चाहिए।

तो, या तो args करने के लिए message (सभी आर्ग अगर आप चाहते हैं) या args[0] बदल (या, यदि आप चिंतित हैं वहाँ कोई आर्ग, अधिक सजावटी संस्करण () के खिलाफ रक्षा करता हो सकता है), जो आप चाहते हैं पर निर्भर करता है।

इस बदलाव का कारण यह है कि नए शैली के अपवादों के साथ, raise या except पर कोई जादू नहीं है; आप बस raise कथन में अपवाद वर्ग के निर्माता को कॉल कर रहे हैं, और except कथन में एक चर में अपवाद को पकड़ रहे हैं। तो:

try: 
    raise MyException('Out of cheese error', 42) 
except Exception as x: 
    print x.args 

यह ('Out of cheese error', 42) प्रिंट होगा। यदि आपके पास केवल print x.message था तो आपको बस 'Out of cheese error' मिलेगा। तो, अपवाद उप-वर्ग जो एक अलग सदस्य के रूप में त्रुटि कोड को ले जाने के लिए फैंसी चीजें करने के लिए उपयोग करते थे, आदि को सरल बनाया जा सकता है; वास्तव में, पूरी बात इस पर आती है:

class BaseException(object): 
    def __init__(self, *args): 
    self.args = args 
0

अपने SandboxError वर्ग Exception से विरासत में मिली है कक्षा? यदि नहीं, तो आपको यह संदेश मिल जाएगा। तर्क PEP352 में वर्णित है।

कोड में, अपने अपवाद इस तरह परिभाषित किया जाना चाहिए:

class SandboxException(Exception): 
    .... 
+0

हां मैंने अपवाद से सैंडबॉक्स एरर क्लास का उत्तराधिकारी किया है। वर्ग SandboxError (अपवाद): पास – PythonDev

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