In the Python bindings for ecCodes, there are a set of exception classes which allow the user to see what kind of exception was raised.  Client code that currently handles exceptions does not need to be changed because the new exceptions are subclassed from the current CodesInternalError.


# The class CodesInternalError is the base class for all these exceptions
 
class FunctionalityNotEnabledError(CodesInternalError):
    """Functionality not enabled."""
class WrongBitmapSizeError(CodesInternalError):
    """Size of bitmap is incorrect."""
class OutOfRangeError(CodesInternalError):
    """Value out of coding range."""
class UnsupportedEditionError(CodesInternalError):
    """Edition not supported.."""
class AttributeNotFoundError(CodesInternalError):
    """Attribute not found.."""
class TooManyAttributesError(CodesInternalError):
    """Too many attributes. Increase MAX_ACCESSOR_ATTRIBUTES."""
class AttributeClashError(CodesInternalError):
    """Attribute is already present, cannot add."""
class NullPointerError(CodesInternalError):
    """Null pointer."""
class MissingBufrEntryError(CodesInternalError):
    """Missing BUFR table entry for descriptor."""
class WrongConversionError(CodesInternalError):
    """Wrong type conversion."""
class StringTooSmallError(CodesInternalError):
    """String is smaller than requested."""
class InvalidKeyValueError(CodesInternalError):
    """Invalid key value."""
class ValueDifferentError(CodesInternalError):
    """Value is different."""
class DifferentEditionError(CodesInternalError):
    """Edition of two messages is different."""
class InvalidBitsPerValueError(CodesInternalError):
    """Invalid number of bits per value."""
class CorruptedIndexError(CodesInternalError):
    """Index is corrupted."""
class MessageMalformedError(CodesInternalError):
    """Message malformed."""
class UnderflowError(CodesInternalError):
    """Underflow."""
class SwitchNoMatchError(CodesInternalError):
    """Switch unable to find a matching case."""
class ConstantFieldError(CodesInternalError):
    """Constant field."""
class MessageTooLargeError(CodesInternalError):
    """Message is too large for the current architecture."""
class InternalArrayTooSmallError(CodesInternalError):
    """An internal array is too small."""
class PrematureEndOfFileError(CodesInternalError):
    """End of resource reached when reading message."""
class NullIndexError(CodesInternalError):
    """Null index."""
class EndOfIndexError(CodesInternalError):
    """End of index reached."""
class WrongGridError(CodesInternalError):
    """Grid description is wrong or inconsistent."""
class NoValuesError(CodesInternalError):
    """Unable to code a field without values."""
class EndError(CodesInternalError):
    """End of resource."""
class WrongTypeError(CodesInternalError):
    """Wrong type while packing."""
class NoDefinitionsError(CodesInternalError):
    """Definitions files not found."""
class HashArrayNoMatchError(CodesInternalError):
    """Hash array no match."""
class ConceptNoMatchError(CodesInternalError):
    """Concept no match."""
class OutOfAreaError(CodesInternalError):
    """The point is out of the grid area."""
class MissingKeyError(CodesInternalError):
    """Missing a key from the fieldset."""
class InvalidOrderByError(CodesInternalError):
    """Invalid order by."""
class InvalidNearestError(CodesInternalError):
    """Invalid nearest id."""
class InvalidKeysIteratorError(CodesInternalError):
    """Invalid keys iterator id."""
class InvalidIteratorError(CodesInternalError):
    """Invalid iterator id."""
class InvalidIndexError(CodesInternalError):
    """Invalid index id."""
class InvalidGribError(CodesInternalError):
    """Invalid grib id."""
class InvalidFileError(CodesInternalError):
    """Invalid file id."""
class WrongStepUnitError(CodesInternalError):
    """Wrong units for step (step must be integer)."""
class WrongStepError(CodesInternalError):
    """Unable to set step."""
class InvalidTypeError(CodesInternalError):
    """Invalid key type."""
class WrongLengthError(CodesInternalError):
    """Wrong message length."""
class ValueCannotBeMissingError(CodesInternalError):
    """Value cannot be missing."""
class InvalidSectionNumberError(CodesInternalError):
    """Invalid section number."""
class NullHandleError(CodesInternalError):
    """Null handle."""
class InvalidArgumentError(CodesInternalError):
    """Invalid argument."""
class ReadOnlyError(CodesInternalError):
    """Value is read only."""
class MemoryAllocationError(CodesInternalError):
    """Memory allocation error."""
class GeocalculusError(CodesInternalError):
    """Problem with calculation of geographic attributes."""
class NoMoreInSetError(CodesInternalError):
    """Code cannot unpack because of string too small."""
class EncodingError(CodesInternalError):
    """Encoding invalid."""
class DecodingError(CodesInternalError):
    """Decoding invalid."""
class MessageInvalidError(CodesInternalError):
    """Message invalid."""
class IOProblemError(CodesInternalError):
    """Input output problem."""
class KeyValueNotFoundError(CodesInternalError):
    """Key/value not found."""
class WrongArraySizeError(CodesInternalError):
    """Array size mismatch."""
class CodeNotFoundInTableError(CodesInternalError):
    """Code not found in code table."""
class FileNotFoundError(CodesInternalError):
    """File not found."""
class ArrayTooSmallError(CodesInternalError):
    """Passed array is too small."""
class MessageEndNotFoundError(CodesInternalError):
    """Missing 7777 at end of message."""
class FunctionNotImplementedError(CodesInternalError):
    """Function not yet implemented."""
class BufferTooSmallError(CodesInternalError):
    """Passed buffer is too small."""
class InternalError(CodesInternalError):
    """Internal error."""
class EndOfFileError(CodesInternalError):
    """End of resource reached."""