Fixed #6353 (again) by making force_unicode() and smart_str() a bit more robust
in the face of funky Exception instances. This is slightly symptomatic of problems in the calling code, but we don't want to raise a secondary exception whilst trying to display the first one. Based on a patch from Karen Tracey. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8588 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
5dd68fa74a
commit
c6a2bd9b96
|
@ -48,7 +48,19 @@ def force_unicode(s, encoding='utf-8', strings_only=False, errors='strict'):
|
||||||
if hasattr(s, '__unicode__'):
|
if hasattr(s, '__unicode__'):
|
||||||
s = unicode(s)
|
s = unicode(s)
|
||||||
else:
|
else:
|
||||||
|
try:
|
||||||
s = unicode(str(s), encoding, errors)
|
s = unicode(str(s), encoding, errors)
|
||||||
|
except UnicodeEncodeError:
|
||||||
|
if not isinstance(s, Exception):
|
||||||
|
raise
|
||||||
|
# If we get to here, the caller has passed in an Exception
|
||||||
|
# subclass populated with non-ASCII data without special
|
||||||
|
# handling to display as a string. We need to handle this
|
||||||
|
# without raising a further exception. We do an
|
||||||
|
# approximation to what the Exception's standard str()
|
||||||
|
# output should be.
|
||||||
|
s = ' '.join([force_unicode(arg, encoding, strings_only,
|
||||||
|
errors) for arg in s])
|
||||||
elif not isinstance(s, unicode):
|
elif not isinstance(s, unicode):
|
||||||
# Note: We use .decode() here, instead of unicode(s, encoding,
|
# Note: We use .decode() here, instead of unicode(s, encoding,
|
||||||
# errors), so that if s is a SafeString, it ends up being a
|
# errors), so that if s is a SafeString, it ends up being a
|
||||||
|
@ -72,6 +84,12 @@ def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
|
||||||
try:
|
try:
|
||||||
return str(s)
|
return str(s)
|
||||||
except UnicodeEncodeError:
|
except UnicodeEncodeError:
|
||||||
|
if isinstance(s, Exception):
|
||||||
|
# An Exception subclass containing non-ASCII data that doesn't
|
||||||
|
# know how to print itself properly. We shouldn't raise a
|
||||||
|
# further exception.
|
||||||
|
return ' '.join([smart_str(arg, encoding, strings_only,
|
||||||
|
errors) for arg in s])
|
||||||
return unicode(s).encode(encoding, errors)
|
return unicode(s).encode(encoding, errors)
|
||||||
elif isinstance(s, unicode):
|
elif isinstance(s, unicode):
|
||||||
return s.encode(encoding, errors)
|
return s.encode(encoding, errors)
|
||||||
|
|
Loading…
Reference in New Issue