2013-06-27 30 views
6

Dường như các thông báo KeyError không được quản lý giống như cách các lỗi khác. Ví dụ nếu tôi muốn sử dụng màu sắc, nó sẽ làm việc cho một IndexError nhưng cũng không cho một KeyError:python nâng cao thông điệp KeyError với màu

err_message = '\x1b[31m ERROR \x1b[0m' 

print err_message 

raise IndexError(err_message) 

raise KeyError(err_message) 

Bất cứ ý tưởng tại sao? Và có cách nào bỏ qua nó không? (Tôi thực sự cần ngoại lệ loại KeyError để được nêu ra, để có thể bắt được sau)

+2

Bạn đã cân nhắc sử dụng ghi nhật ký và tô màu đầu ra từ quá trình ghi nhật ký hơn là cố gắng tô màu thông báo lỗi không? http://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output – BorrajaX

Trả lời

4

Những hành vi ngoại lệ này khác nhau. KeyError không hành động sau đây với thông điệp thông qua

If args is a tuple of exactly one item, apply repr to args[0]. 
    This is done so that e.g. the exception raised by {}[''] prints 
    KeyError: '' 
    rather than the confusing 
    KeyError 
    alone. The downside is that if KeyError is raised with an explanatory 
    string, that string will be displayed in quotes. Too bad. 
    If args is anything else, use the default BaseException__str__(). 

Người ta có thể sử dụng workaround sau cho việc này: Tạo lớp riêng với repr overrided:

ví dụ

class X(str): 
    def __repr__(self): 
     return "'%s'" % self 

raise KeyError(X('\x1b[31m ERROR \x1b[0m')) 

nhưng tôi thực sự don' t hiểu Tại sao điều này có thể cần thiết ... Tôi nghĩ rằng nhận xét @BorrajaX là giải pháp tốt hơn.

+0

cảm ơn vì giải pháp tuyệt vời này! Nó thực hiện công việc! Tôi sẽ đi cho rằng thay vì sử dụng đăng nhập ... nó có vẻ dễ dàng hơn trong trường hợp của tôi! –

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