# Django 3.2.11.dev 文档

# Django 异常

Django 会引发一些自己的异常以及标准的 Python 异常。

## Django 核心异常

Django 核心异常类定义在 `django.core.exceptions` 中。

### `AppRegistryNotReady`

exception `AppRegistryNotReady`

  当在初始化 ORM 的 应用加载过程 完成之前，试图使用模型时，就会引发这个异常。

### `ObjectDoesNotExist`

exception `ObjectDoesNotExist`

  `Model.DoesNotExist` 异常的基类。一个对 `ObjectDoesNotExist` 的 `try/except` 将捕获对所有模型的 `DoesNotExist` 异常。

  参见 `get()`。

### `EmptyResultSet`

exception `EmptyResultSet`

  如果一个查询不返回任何结果，那么 `EmptyResultSet` 可能会在生成查询的过程中被触发。大多数 Django 项目不会遇到这个异常，但它可能对实现自定义查找和表达式很有用。

### `FieldDoesNotExist`

exception `FieldDoesNotExist`

  当请求的字段在模型或模型的父类上不存在时，模型的 `_meta.get_field()` 方法会引发 `FieldDoesNotExist` 异常。

### `MultipleObjectsReturned`

exception `MultipleObjectsReturned`

  `Model.MultipleObjectsReturned` 异常的基类。一个对 `MultipleObjectsReturned` 的 `try/except` 将捕获对所有模型的 `MultipleObjectsReturned` 异常。

  参见 `get()`。

### `SuspiciousOperation`

exception `SuspiciousOperation`

  `SuspiciousOperation` 异常是在用户进行了从安全角度看应该被认为是可疑的操作时产生的，例如篡改会话 cookie。`SuspiciousOperation` 的子类包括：

  - `DisallowedHost`
  - `DisallowedModelAdminLookup`
  - `DisallowedModelAdminToField`
  - `DisallowedRedirect`
  - `InvalidSessionKey`
  - `RequestDataTooBig`
  - `SuspiciousFileOperation`
  - `SuspiciousMultipartForm`
  - `SuspiciousSession`
  - `TooManyFieldsSent`

  如果一个 `SuspiciousOperation` 异常达到 ASGI／WSGI 处理程序级别，它将被记录在 `Error` 级别，并导致一个 `HttpResponseBadRequest`。更多信息请参见 :doc:`日志文档 `。

### `PermissionDenied`

exception `PermissionDenied`

  `PermissionDenied` 异常是在用户没有权限执行所请求的操作时发生的。

### `ViewDoesNotExist`

exception `ViewDoesNotExist`

  当请求的视图不存在时， `ViewDoesNotExist` 异常由 `django.urls` 引发。

### `MiddlewareNotUsed`

exception `MiddlewareNotUsed`

  当服务器配置中没有使用中间件时，会引发 `MiddlewareNotUsed` 异常。

### `ImproperlyConfigured`

exception `ImproperlyConfigured`

  `ImproperlyConfigured` 异常是在 Django 配置不当的情况下产生的，例如，`settings.py` 中的一个值不正确或无法解析。

### `FieldError`

exception `FieldError`

  `FieldError` 异常是在模型字段出现问题时引发的。发生这种情况有几种原因：

  - 模型中的一个字段与抽象基类中的同名字段发生冲突
  - 无限循环是由排序引起的
  - 不能从过滤器参数中解析关键字
  - 一个字段不能通过查询参数中的关键字来确定
  - 不允许在指定字段上进行 join
  - 字段名无效
  - 查询包含无效的 order_by 参数

### `ValidationError`

exception `ValidationError`

  当数据未能通过表单或模型字段验证时，会引发 `ValidationError` 异常。关于验证的更多信息，请参见 表单和字段验证、 模型字段验证 和 验证器参考。

#### `NON_FIELD_ERRORS`

`NON_FIELD_ERRORS`

`ValidationError` 不属于表格或模型中某一特定字段的错误被归类为 `NON_FIELD_ERRORS`。这个常量在字典中被用作键，否则就会将字段映射到它们各自的错误列表中。

### `BadRequest`

exception `BadRequest`
  New in Django 3.2.

  `BadRequest` 异常是在请求由于客户端错误而不能被处理时引发的。如果一个 `BadRequest` 异常到达 ASGI／WSGI 处理程序级别，它会导致一个 `HttpResponseBadRequest`。

### `RequestAborted`

exception `RequestAborted`

  `RequestAborted` 异常是在处理程序读入的 HTTP body 在传输流中被切断，客户端连接关闭，或者客户端不发送数据，遇到超时，服务器关闭连接时引发的。

  它是 HTTP 处理模块内部的，你不太可能在其他地方看到它。如果你正在修改 HTTP 处理代码，你应该在遇到一个中止的请求时提出这个问题，以确保 socket 被干净地关闭。

### `SynchronousOnlyOperation`

exception `SynchronousOnlyOperation`

  当只有在同步 Python 代码中才允许的代码被从异步上下文（一个有正在运行的异步事件循环的线程）中调用时，会引发 `SynchronousOnlyOperation` 异常。Django 的这些部分一般都严重依赖线程安全来运行，在协程共享同一个线程的情况下无法正常工作。

  如果你想从一个异步线程中调用只用于同步的代码，那么就创建一个同步线程并在该线程中调用它。你可以通过 `asgiref.sync.sync_to_async()` 来实现。

## URL 解析器异常

URL 解析器异常定义在 `django.urls` 中。

### `Resolver404`

exception `Resolver404`

  `resolve()` 如果传递给 `resolve()` 的路径没有映射到视图，那么 `Resolver404` 异常就会被 `resolve()` 引发。这是 `django.http.Http404` 的一个子类。

### `NoReverseMatch`

exception `NoReverseMatch`

  `NoReverseMatch` 异常是由 `django.urls` 引发的，当你的 URLconf 中不能根据提供的参数识别出一个匹配的 URL 时会引发。

## 数据库异常

数据库异常可以从 `django.db` 导入。

Django 封装了标准的数据库异常，这样你的 Django 代码就可以保证这些类的通用实现。

exception `Error`

exception `InterfaceError`

exception `DatabaseError`

exception `DataError`

exception `OperationalError`

exception `IntegrityError`

exception `InternalError`

exception `ProgrammingError`

exception `NotSupportedError`

数据库异常的 Django 包装器的行为与底层数据库异常完全相同。更多信息请参见 PEP 249，Python 数据库 API 规范 v2.0。

根据 PEP 3134，`__cause__` 属性与原始（基础）数据库异常一起设置，允许访问提供的任何附加信息。

exception `models.``ProtectedError`

当使用 `django.db.models.PROTECT` 时，为了防止删除引用对象而引发的 `models.ProtectedError` 是 `IntegrityError` 的子类。

exception `models.``RestrictedError`

当使用 `django.db.models.RESTRICT` 时，为了防止删除引用对象而引发的 `models.RestrictedError` 是 `IntegrityError` 的子类。

## Http 异常

Http 异常可以从 `django.http` 导入。

### `UnreadablePostError`

exception `UnreadablePostError`

  `UnreadablePostError` 在用户取消上传时引发。

## 会话异常

会话异常在 `django.contrib.session.exceptions` 中定义。

### `SessionInterrupted`

exception `SessionInterrupted`
  New in Django 3.2.

  `SessionInterrupted` 是当一个会话在一个并发请求中被破坏时引发的。它是 `BadRequest` 的一个子类。

## 事务异常

事务异常在 `django.db.transaction` 中定义。

### `TransactionManagementError`

exception `TransactionManagementError`

  `TransactionManagementError` 是针对与数据库事务有关的任何和所有问题提出的。

## 测试框架异常

`django.test` 包提供的异常。

### `RedirectCycleError`

exception `client.``RedirectCycleError`

  `RedirectCycleError` 当测试客户端检测到一个循环或过长的重定向链时，就会引发。

## Python 异常

Django 也会在适当的时候引发内置的 Python 异常。更多关于 Built-in Exceptions 的信息请参见 Python 文档。