2015-03-17 16 views
6

Unicode dizeleriyle Python 2 kodu yazıyor, unicode_literals içeriyor ve yükseltme istisnaları ile ilgili sorunlarım var.Unicode dizesi içeren bir Özel Durumu nasıl alabilirim?

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

from __future__ import unicode_literals 

raise Exception('Tést') 

Bunu yaparken, 'Tést' dizgisi terminalden çıkarılır.

ben doğrusu bütün raise Exception tablolara bu yapmak zorunda daha global bir çözüm bulmak istiyorum

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

ile bu geçici bir çözüm bulabilirler.

(ı İstisna mesajlarında PyQt'nin tr() fonksiyonunu kullanıyorum beri özel karakterler ele alınması gerekir, ben encode('utf-8') gerekli olup olmadığını zaman kodlama de bilemez.)

kötü. Bazen bir İstisna'yı yakalamak, mesajını almak ve ilk İstisna dizesiyle bir temel dizeyi birleştirerek yeni bir İstisnayı yükseltmek istiyorum.

ben bu şekilde yapmak zorunda:

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

ama gerçekten daha az külfetli olmak isterdim (ve bu örnek bile self.tr() aramaları içermez).

Daha basit bir yolu var mı?

soruya Aşağıdaki yorum

+0

Yasal Uyarı: PyQT'nin tr() yöntemini ve onu nasıl kullandığınızı bilmiyorum, bu nedenle sorunun özelliklerini çok iyi anlayamıyorum. Sadece ilgili şeylere baktığınızdan emin olmak için: - Global stderr kancalarına baktın mı? (http://stackoverflow.com/questions/8288717/python-print-passing-extra-text-to-sys-stdout, http://www.macfreek.nl/memory/Encoding_of_Python_stdout); - İstisna kancalarına baktınız mı? (http://www.creativelydo.com/blog/how-to-globally-customize-exceptions-in-python/) - biçimlendirme istisnalarında çok fazla özgürlük; - Kendi istisna sınıfınızı kullanmayı denediniz mi? – morfizm

+4

Zaten kendi sorunuzu cevapladınız: Python3 cevaptır. Yeni bir proje başlatıyorsanız, bunu yapmak için çok iyi nedenleriniz olmadığı sürece Python2'yi kullanmamalısınız (örn. Kaçınılmaz bağımlılıklar). Python3'teki unicode gelişmeleri muhtemelen en büyük satış noktalarından biridir - aslında karşılaştığınız konular * tam olarak neden * bu gelişmeler yapıldı. – ekhumoro

+0

Evet, ekhumoro, Python3'ü tercih ederim. Bağımlılık nedeniyle Python 2'yi kullanmalıyız. Alternatif olmadığını kontrol edeceğim. Bu arada, bir ilke olarak, geleceğe uyumlu olmak ve olması gereken şeyleri yapmak için elimden geleni yapıyorum. İdeal bir yol olmadığını doğruladığınızdan, geçici çözümümüzü seçeceğim. "Kendi İstisna sınıfı" açıkça kanonik şekilde değil, ama makul bir çözüm gibi görünüyor. –

cevap

7

Teşekkürler, ben bu geldi (Ve bir yan soru olarak, İstisna kullanımı unicode dizeleri? Misin? Python3 aranız basittir).

Buradaki fikir, özel bir Özel Durum alt sınıfını kullanmaktır.

# -*- 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

zarif bir çözüm, sadece kaynak kod dosyasının başında # - * - kodlama: utf8 - * - eklememiz gerektiğini hatırlatırız, aksi halde hata mesajını alırken beklenmedik bir şekilde işaretleyecektir :) – wllbll