2015-03-17 3 views
6

मैं यूनिकोड स्ट्रिंग्स के साथ पायथन 2 कोड लिख रहा हूं, यूनिकोड_लिटरल्स आयात कर रहा हूं और मुझे अपवाद उठाने में समस्याएं हैं।मैं एक अपवाद कैसे बढ़ा सकता हूं जिसमें यूनिकोड स्ट्रिंग शामिल है?

# -*- coding: utf-8 -*- 

from __future__ import unicode_literals 

raise Exception('Tést') 

ऐसा करने पर, 'टेस्ट' स्ट्रिंग टर्मिनल से अलग हो जाती है।

मैं

raise Exception('Tést'.encode('utf-8')) 

साथ इस समाधान कर सकते हैं मैं नहीं बल्कि सभी raise Exception बयान में यह करने के लिए की तुलना में एक वैश्विक समाधान खोजने चाहते हैं।

(जब से मैं अपवाद संदेशों में PyQt के tr() समारोह का उपयोग कर रहा हूँ, विशेष वर्ण नियंत्रित किया जाना चाहिए, मैं समय है कि क्या encode('utf-8') आवश्यक है कोडिंग में पता नहीं कर सकते हैं।)

इससे भी बदतर। कभी-कभी, मैं अपवाद पकड़ना चाहता हूं, अपना संदेश प्राप्त करना चाहता हूं, और एक नई अपवाद उठा सकता हूं, जो पहली अपवाद स्ट्रिंग के साथ बेस स्ट्रिंग को जोड़ता है।

मैं इसे इस तरह से करना है:

try: 
    raise TypeError('Tést'.encode('utf-8')) 
except Exception as e: 
    raise Exception('Exception: {}'.format(str(e).decode('utf-8')).encode('utf-8')) 

लेकिन मैं वास्तव में चाहते हैं यह कम बोझिल हो सकता है (और इस उदाहरण भी self.tr() कॉल शामिल नहीं है)।

क्या कोई आसान तरीका है?

(और एक पक्ष प्रश्न के रूप में, python3 साथ बातें सरल कर रहे हैं? अपवाद उपयोग यूनिकोड तार? सकता है)

+0

अस्वीकरण: मैं PyQT के टीआर() और आप इसे कैसे उपयोग करने से परिचित नहीं हूँ, इसलिए मैं इस मुद्दे की बारीकियों बहुत अच्छी तरह से नहीं समझ सकते हैं। बस यह सुनिश्चित करने के लिए कि आपने संबंधित चीजों को देखा: - क्या आपने वैश्विक stderr hooks को देखा था? (http://stackoverflow.com/questions/8288717/python-print-passing-extra-text-to-sys-stdout, http://www.macfreek.nl/memory/Encoding_of_Python_stdout); - क्या आपने अपवाद हुक देखा था? (http://www.creativelydo.com/blog/how-to-globally-customize-exceptions-in-python/) - अपवादों को स्वरूपित करने में बहुत सारी स्वतंत्रता; - क्या आपने अपनी अपवाद कक्षा का उपयोग करने का प्रयास किया था? – morfizm

+4

आप पहले से ही अपने प्रश्न का उत्तर दे चुके हैं: पायथन 3 उत्तर है। यदि आप एक नई परियोजना शुरू कर रहे हैं, तो आपको वास्तव में Python2 का उपयोग नहीं करना चाहिए जब तक कि आपके पास ऐसा करने के बहुत अच्छे कारण नहीं हैं (उदा। अपरिहार्य निर्भरता)। पायथन 3 में यूनिकोड सुधार शायद सबसे ज्यादा बिकने वाले बिंदुओं में से एक हैं - असल में, जिन मुद्दों का आप सामना कर रहे हैं वे हैं * बिल्कुल * उन सुधारों को क्यों बनाया गया। – ekhumoro

+0

हां, एखुमोरो, मैं पाइथन 3 जाऊंगा। हमें निर्भरता के कारण पाइथन 2 का उपयोग करना होगा। मैं दोबारा जांच करूंगा कि कोई विकल्प नहीं है। इस बीच, एक सिद्धांत के रूप में, मैं भविष्य में अनुपालन करने के लिए अपना सर्वश्रेष्ठ प्रयास कर रहा हूं और जिस तरह से उन्हें होना चाहिए। चूंकि आप पुष्टि करते हैं कि कोई आदर्श तरीका नहीं है, इसलिए मैं अपना कामकाज चुनूंगा। "स्वयं अपवाद वर्ग" स्पष्ट रूप से वैचारिक तरीका नहीं है, लेकिन यह एक उचित कामकाज की तरह दिखता है। –

उत्तर

7

सवाल नीचे टिप्पणी के लिए धन्यवाद, मैं इस के साथ आया था।

विचार कस्टम अपवाद उपclass का उपयोग करना है।

# -*- coding: utf-8 -*- 

from __future__ import unicode_literals 

class MyException(Exception): 

    def __init__(self, message): 

     if isinstance(message, unicode): 
      super(MyException, self).__init__(message.encode('utf-8')) 
      self.message = message 

     elif isinstance(message, str): 
      super(MyException, self).__init__(message) 
      self.message = message.decode('utf-8') 

     # This shouldn't happen... 
     else: 
      raise TypeError 

    def __unicode__(self): 

     return self.message 

class MySubException(MyException): 
    pass 

try: 
    raise MyException('Teét') 
except MyException as e: 
    print(e.message) 
    raise MySubException('SubException: {}'.format(e)) 
+0

सुरुचिपूर्ण समाधान, बस याद दिलाएं कि हमें स्रोत कोड फ़ाइल की शुरुआत में # - * - कोडिंग: utf8 - * जोड़ना चाहिए, या त्रुटि संदेश प्राप्त होने पर अप्रत्याशित संकेत का सामना करना होगा :) – wllbll

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