捕获 NotImplementedError 不在 except 块中执行代码

Catching NotImplementedError not executing code in except block

PostgreSQL 能够进行 .distint('field name') 数据库查询,但是 Sqlite 不能,所以我创建了一个 try/except 块,如果用户正在使用,它应该 运行 一个更简单的查询sqlite3.

try:
    qs = qs.filter(tag__istartswith=self.q).order_by('tag').distinct('tag')
except NotImplementedError:
    qs = qs.filter(tag__istartswith=self.q)

因此,如果用户使用的是 Sqlite,我希望 except 块中的简单查询得到执行,但是异常被抛出并且简单查询永远不会执行:

raise NotImplementedError('DISTINCT ON fields is not supported by this database backend')
NotImplementedError: DISTINCT ON fields is not supported by this database backend

您知道为什么这没有按预期工作吗?

谢谢

因为querysets are lazy并且错误不是在构建查询时引发的,而是在您实际评估它时引发的。

你可以尝试forcing your query to be evaluated捕获异常:

try:
    qs = qs.filter(tag__istartswith=self.q).order_by('tag').distinct('tag')
    dummy_boolean_var = qs.exists()
except NotImplementedError:
    qs = qs.filter(tag__istartswith=self.q)

编辑:显然我未经测试的版本没有工作,因为 except 子句中的分配试图修改原始查询。这是 OP 测试的工作版本:

try:
    qa = qs
    qs = qs.filter(tag__istartswith=self.q).order_by('tag').distinct(‌​'tag')
    dummy_boolean_var = qs.exists()
except NotImplementedError:
    qs = qa
    qs = qs.filter(tag__istartswith=self.q)