2015-03-17 19 views
6

Tôi đang viết mã Python 2 với chuỗi Unicode, nhập unicode_literals và tôi đang gặp vấn đề với việc tăng ngoại lệ.Làm cách nào để có thể tăng ngoại lệ bao gồm chuỗi Unicode?

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

from __future__ import unicode_literals 

raise Exception('Tést') 

Khi thực hiện việc này, chuỗi 'Tést' bị tước khỏi đầu cuối.

tôi có thể workaround này với

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

Tôi muốn tìm một giải pháp toàn cầu vì phải làm điều này trong tất cả raise Exception báo cáo.

(Kể từ khi tôi đang sử dụng chức năng tr() PyQt trong thông điệp ngoại lệ, ký tự đặc biệt phải được xử lý, tôi không thể biết lúc dù encode('utf-8') cần mã hóa.)

Tệ hơn nữa. Đôi khi, tôi muốn bắt một ngoại lệ, nhận được thông điệp của nó, và nâng cao một ngoại lệ mới, nối một chuỗi cơ sở với chuỗi ngoại lệ đầu tiên.

tôi phải làm điều đó theo cách này:

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

nhưng tôi thực sự muốn nó có thể ít cồng kềnh (và ví dụ này thậm chí không bao gồm các self.tr() cuộc gọi).

Có cách nào đơn giản hơn không?

(Và như một câu hỏi phụ, là những thứ đơn giản hơn với Python3? Có thể ngoại lệ sử dụng unicode dây?)

+0

Tuyên bố từ chối trách nhiệm: Tôi không quen với trQT của PyQT() và cách bạn sử dụng, vì vậy tôi có thể không hiểu rõ vấn đề cụ thể. Chỉ để chắc chắn rằng bạn đã xem xét những thứ liên quan: - Bạn đã nhìn vào móc móc toàn cầu chưa? (http://stackoverflow.com/questions/8288717/python-print-passing-extra-text-to-sys-stdout, http://www.macfreek.nl/memory/Encoding_of_Python_stdout); - Bạn có nhìn vào móc ngoại lệ không? (http://www.creativelydo.com/blog/how-to-globally-customize-exceptions-in-python/) - rất nhiều quyền tự do trong định dạng ngoại lệ; - Bạn đã thử sử dụng lớp ngoại lệ của riêng mình chưa? – morfizm

+4

Bạn đã trả lời câu hỏi của riêng bạn: Python3 là câu trả lời. Nếu bạn đang bắt đầu một dự án mới, bạn thực sự không nên sử dụng Python2 trừ khi bạn có lý do rất tốt để làm như vậy (ví dụ: các phụ thuộc không thể tách rời). Các cải tiến unicode trong Python3 có lẽ là một trong những điểm bán hàng lớn nhất của nó - trên thực tế, các vấn đề bạn đang phải đối mặt là * chính xác * tại sao những cải tiến đó lại được thực hiện. – ekhumoro

+0

Vâng, ekhumoro, tôi thích dùng Python3 hơn. Chúng ta phải sử dụng Python 2 vì sự phụ thuộc. Tôi sẽ kiểm tra lại không có thay thế. Trong khi chờ đợi, như một nguyên tắc, tôi đang cố hết sức để tuân thủ tương lai và làm mọi thứ theo cách của họ. Vì bạn xác nhận không có cách nào lý tưởng, tôi sẽ chọn cách giải quyết của mình. "Lớp ngoại lệ của riêng" rõ ràng không phải là cách kinh điển, nhưng nó trông giống như một cách giải quyết hợp lý. –

Trả lời

7

Nhờ các ý kiến ​​bên dưới câu hỏi, tôi đã đưa ra với điều này.

Ý tưởng là sử dụng lớp con Ngoại lệ tùy chỉnh.

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

giải pháp thanh lịch, chỉ cần nhắc nhở rằng chúng ta nên thêm # - * - mã hóa: utf8 - * - ở đầu tệp tin mã nguồn, nếu không sẽ phản đối dấu bất ngờ khi nhận được thông báo lỗi :) – wllbll

Các vấn đề liên quan