Jelajahi Sumber

Smarter unicode handling for exceptions

Ask Solem 14 tahun lalu
induk
melakukan
ec34b023b4
1 mengubah file dengan 12 tambahan dan 7 penghapusan
  1. 12 7
      celery/worker/job.py

+ 12 - 7
celery/worker/job.py

@@ -55,12 +55,17 @@ class AlreadyExecutedError(Exception):
     world-wide state."""
 
 
-def default_encode(obj):
+def default_encoding():
     if sys.platform.startswith("java"):
-        coding = "utf-8"
-    else:
-        coding = sys.getfilesystemencoding()
-    return unicode(obj, coding)
+        return "utf-8"
+    return sys.getfilesystemencoding()
+
+
+def safe_str(s, errors="replace"):
+    encoding = default_encoding()
+    if isinstance(s, unicode):
+        return s.encode(encoding, errors)
+    return s
 
 
 class WorkerTaskTrace(TaskTrace):
@@ -501,8 +506,8 @@ class TaskRequest(object):
         context = {"hostname": self.hostname,
                    "id": self.task_id,
                    "name": self.task_name,
-                   "exc": repr(exc_info.exception),
-                   "traceback": default_encode(exc_info.traceback),
+                   "exc": safe_str(repr(exc_info.exception)),
+                   "traceback": safe_str(exc_info.traceback),
                    "args": self.args,
                    "kwargs": self.kwargs}