This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author ncoghlan
Recipients barry, ezio.melotti, flox, lemburg, ncoghlan, vstinner
Date 2013-11-05.13:48:40
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1383659320.87.0.979046638305.issue17828@psf.upfronthosting.co.za>
In-reply-to
Content
New and improved implementation attached that extracts the exception chaining to a helper functions and calls it only when it is the call in to the codecs machinery that failed (eliminating the need for the output flag, and covering decoding as well as encoding).

TypeError, AttributeError and ValueError are all wrapped with chained exceptions that mention the codec that failed.

(Annoyingly, bz2_codec throws OSError instead of ValueError for bad input data, but wrapping OSError safely is a pain due to the extra state potentially carried on instances. So letting it escape unwrapped is the simpler and more conservative option at this point)

>>> import codecs
>>> codecs.encode(b"hello", "bz2_codec").decode("bz2_codec")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bz2_codec' decoder returned 'bytes' instead of 'str'; use codecs.decode to decode to arbitrary types

>>> b"hello".decode("rot_13")
AttributeError: 'memoryview' object has no attribute 'translate'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: decoding with 'rot_13' codec failed (AttributeError: 'memoryview' object has no attribute 'translate')

>>> "hello".encode("bz2_codec")
TypeError: 'str' does not support the buffer interface

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2_codec' codec failed (TypeError: 'str' does not support the buffer interface)

>>> "hello".encode("rot_13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'rot_13' encoder returned 'str' instead of 'bytes'; use codecs.encode to encode to arbitrary types
History
Date User Action Args
2013-11-05 13:48:40ncoghlansetrecipients: + ncoghlan, lemburg, barry, vstinner, ezio.melotti, flox
2013-11-05 13:48:40ncoghlansetmessageid: <1383659320.87.0.979046638305.issue17828@psf.upfronthosting.co.za>
2013-11-05 13:48:40ncoghlanlinkissue17828 messages
2013-11-05 13:48:40ncoghlancreate