如何捕获此异常?

这段代码在django/db/models/fields.py中,它创建/定义了一个异常吗

类ReverseSingleRelatedObjectDescriptor(六个,带有_元类(重命名ReminateRadeObjectDescriptorMethods)):
#此类提供了生成相关对象的功能
#管理器作为模型类上的属性提供,用于具有
#定义相关字段的类上的单个“远程”值。
#在“choice.poll”示例中,poll属性是
#ReverseSingleRelatedObjectDescriptor实例。
def u u初始(自我,带rel的字段):
self.field=带\u rel的字段
self.cache\u name=self.field.get\u cache\u name()
@缓存的不动产
def RelatedObjectsDoesNotExist(自):
#无法在初始化时创建异常,因为
#相关模型可能尚未解决`对`的关系可能仍然存在
#字符串模型引用。
返回类型(
str('relatedObjectsDoesNotExist'),
(self.field.rel.to.DoesNotExist,AttributeError),
{}
)

这在django/db/models/fields/related.py中,它引发了上述异常:

def\uuuu get\uuuu(self、instance、instance\u type=None):
如果实例为“无”:
回归自我
尝试:
rel_obj=getattr(实例,self.cache_名称)
除属性错误外:
val=self.field.get_local_related_值(实例)
如果val中没有:
rel_obj=无
其他:
params=dict(
(rh_field.attname,getattr(实例,lh_field.attname))
对于lh_字段,在self.field.related_字段中为rh_字段)
qs=self.get\u queryset(实例=instance)
extra\u filter=self.field.get\u extra\u描述符\u filter(实例)
如果存在(额外过滤器,dict):
参数更新(额外过滤器)
qs=qs.filter(**参数)
其他:
qs=qs.filter(额外的过滤器,**参数)
#假设数据库强制使用外键,这不会失败。
rel_obj=qs.get()
如果不是self.field.rel.multiple:
setattr(rel_obj,self.field.related.get_cache_name(),实例)
setattr(实例,self.cache\u name,rel\u obj)
如果rel_obj为None且不是self.field.null:
提出与自我相关的对象不符合条件(
%s没有%s.“%(self.field.model.\u\u名称,self.field.name)
)
其他:
返回相关对象

问题在于此代码:

尝试:
val=getattr(对象,属性名称)
除related.ReversesingRelatedObjectDescriptor.RelatedObjectDoesNotExist外:
val=None#不捕获抛出的异常
除作为foo的例外情况外:
打印类型(foo)#此处捕捉,而非上方

我不会抓住那个例外

&gt&燃气轮机&燃气轮机;打印类型(foo)
<类“django.db.models.fields.related.RelatedObjectDoesNotExist”>
&燃气轮机&燃气轮机&燃气轮机;iInstance(foo,related.FieldDoesNotExist)
错误的

相关对象除外。RelatedObjectsDoesNotExister:

引发一个AttributeError:“模块”对象没有属性“RelatedObjectDoesNotExist”

&gt&燃气轮机&燃气轮机;isinstance(foo,related.reversesingrelatedObjectDescriptor.RelatedObjectDoesNotExist)
回溯(最近一次呼叫最后一次):
文件“<字符串>”,第1行,在<碎片>
TypeError:isinstance()arg 2必须是类、类型或类和类型的元组

这可能就是原因

如果您的相关模型名为Foo,您可以执行以下操作:

除Foo.DoesNotExist外:

Django在不可怕的时候是令人惊奇的RelatedObjectDoesNotExist是一个属性,返回在运行时动态计算的类型。该类型使用self.field.rel.to.DoesNotExist作为基类

根据Django文件:

实干家

异常模型。DoesNotExist

当预期的对象不存在时,ORM会引发此异常
建立例如,QuerySet.get()将在没有对象时引发它
为给定的查找找到

Django提供了一个作为
每个模型类都可以标识无法访问的对象类
找到,允许您捕获特定模型类的异常

异常是django.core.exceptions.ObjectDoesNotExist的子类

这就是让这一切发生的魔力。一旦建立了模型,self.field.rel.to.DoesNotExist就是该模型的不存在例外

发表评论