# 19.1.5. `email.errors`: 异常和缺陷类

源代码: Lib/email/errors.py

以下异常类在 `email.errors` 模块中定义：

exception `email.errors.``MessageError`

  这是 `email` 包可以引发的所有异常的基类。 它源自标准异常 `Exception` 类，这个类没有定义其他方法。

exception `email.errors.``MessageParseError`

  这是由 `Parser` 类引发的异常的基类。它派生自 `MessageError`。 `headerregistry` 使用的解析器也在内部使用这个类。

exception `email.errors.``HeaderParseError`

  在解析消息的 RFC 5322 标头时，某些错误条件下会触发，此类派生自 `MessageParseError`。 如果在调用方法时内容类型未知，则 `set_boundary()` 方法将引发此错误。 当尝试创建一个看起来包含嵌入式标头的标头时 `Header` 可能会针对某些 base64 解码错误引发此错误（也就是说，应该是一个 没有前导空格并且看起来像标题的延续行）。

exception `email.errors.``BoundaryError`

  已弃用和不再使用的。

exception `email.errors.``MultipartConversionError`

  当使用 `add_payload()` 将有效负载添加到 `Message` 对象时，有效负载已经是一个标量，而消息的 Content-Type 主类型不是 multipart 或者缺少时触发该异常。 `MultipartConversionError` 多重继承自 `MessageError` 和内置的 `TypeError`。

  由于 `Message.add_payload()` 已被弃用，此异常实际上极少会被引发。 但是如果在派生自 `MIMENonMultipart` 的类 (例如 `MIMEImage`) 的实例上调用 `attach()` 方法也可以引发此异常。

以下是 `FeedParser` 在解析消息时可发现的缺陷列表。 请注意这些缺陷会在问题被发现时加入到消息中，因此举例来说，如果某条嵌套在 multipart/alternative 中的消息具有错误的标头，该嵌套消息对象就会有一条缺陷，但外层消息对象则没有。

所有缺陷类都是 `email.errors.MessageDefect` 的子类。

- `NoBoundaryInMultipartDefect` – 一条消息宣称有多个部分，但却没有 boundary 形参。

- `StartBoundaryNotFoundDefect` – 在 Content-Type 标头中宣称的开始边界无法被找到。

- `CloseBoundaryNotFoundDefect` – 找到了开始边界，但相应的结束边界无法被找到。

  3.3 新版功能.

- `FirstHeaderLineIsContinuationDefect` – 消息以一个继续行作为其第一个标头行。

- `MisplacedEnvelopeHeaderDefect` - 在标头块中间发现了一个 “Unix From” 标头。

- `MissingHeaderBodySeparatorDefect` - 在解析没有前缀空格但又不包含 ‘:’ 的标头期间找到一行内容。 解析将假定该行表示消息体的第一行以继续执行。

  3.3 新版功能.

- `MalformedHeaderDefect` – 找到一个缺失了冒号或格式错误的标头。

  3.3 版后已移除: 此缺陷在近几个 Python 版本中已不再使用。

- `MultipartInvariantViolationDefect` – A message claimed to be a multipart, but no subparts were found. Note that when a message has this defect, its `is_multipart()` method may return false even though its content type claims to be multipart.

- `InvalidBase64PaddingDefect` – 当解码一个 base64 编码的字节分块时，填充的数据不正确。 虽然添加了足够的填充数据以执行解码，但作为结果的已解码字节串可能无效。

- `InvalidBase64CharactersDefect` – 当解码一个 base64 编码的字节分块时，遇到了 base64 字符表以外的字符。 这些字符会被忽略，但作为结果的已解码字节串可能无效。

- `InvalidBase64LengthDefect` – 当解码一个 base64 编码的字节分块时，非填充 base64 字符的数量无效（比 4 的倍数多 1）。 已编码分块会保持原样。