2015-02-20 14 views
6

Tôi đang sử dụng Python 2.7.9. x32 trên Win7 x64.UnicodeDecodeError khi đăng nhập ngoại lệ bằng Python

Khi tôi đăng nhập một ngoại lệ chứa umlauts, tôi luôn nhận được
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 39: ordinal not in range(128)

mã ví dụ của tôi là:

except Exception as e: 
      logging.error('Error loading SCMTool for repository ' 
          '%s (ID %d): %s' % (repo.name, repo.id, e), 
          exc_info=1) 

Các ngoại lệ được đăng nhập là WindowsError: [Error 267] Der Verzeichnisname ist ungültig. Sự cố được dựa trên "ung Ü ltig" umlaut.

Sau khi xóa %s cuối cùng và e, nó hoạt động mà không có sự cố.

Điều này xảy ra mỗi lần ngoại lệ được ghi lại, do đó việc thay đổi mọi trình ghi nhật ký không thay thế.

Có ai có ý tưởng làm cách nào để ngoại lệ trả về chuỗi unicode trên toàn cầu không?

Trả lời

11

Bạn đang cố gắng nội suy một đối tượng unicode thành mẫu str, kích hoạt mã hóa ngầm.

Sử dụng mẫu unicode; logging có thể xử lý Unicode tốt:

logging.error(u'Error loading SCMTool for repository ' 
       '%s (ID %d): %s' % (repo.name, repo.id, e), 
       exc_info=1) 

Hai mẹo khác:

  • Bạn không cần phải làm suy mình; nếu bạn chuyển vào 3 phần tử để nội suy dưới dạng đối số riêng biệt, logging sẽ nội suy cho bạn, nhưng chỉ khi thông báo thực sự được phát ra.

  • Nếu bạn sử dụng logging.exception() thông báo được ghi lại ở mức ERRORexc_info được đặt cho bạn; nó sẽ cho bạn kết quả tương tự nhưng dễ dàng nhận ra hơn khi đọc mã của bạn sau này. Dù bằng cách nào, ngoại lệ là đã bao gồm trong trường hợp đó, không cần phải bao gồm lại trong thư.

Như vậy, tôi muốn sử dụng:

logging.exception(
    'Error loading SCMTool for repository %s (ID %d)', 
    repo.name, repo.id) 
+0

Đây không phải là thực sự mã của tôi, tôi đang sử dụng ReviewBoard trong đó có rất nhiều tập tin với nhiều loggings ngoại lệ. Không còn cách nào khác? Nơi tôi không phải chạm vào tất cả các tệp. – Seega

+0

Có lẽ bạn nên gửi một lỗi với dự án Xem lại rồi? –

+0

Không còn cách nào khác "trung tâm", đây là lỗi về cách xử lý các ngoại lệ. –

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