gpt4 book ai didi

python - 你如何捕捉到这个异常?

转载 作者:IT老高 更新时间:2023-10-28 12:29:14 25 4
gpt4 key购买 nike

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

class ReverseSingleRelatedObjectDescriptor(six.with_metaclass(RenameRelatedObjectDescriptorMethods)):
# This class provides the functionality that makes the related-object
# managers available as attributes on a model class, for fields that have
# a single "remote" value, on the class that defines the related field.
# In the example "choice.poll", the poll attribute is a
# ReverseSingleRelatedObjectDescriptor instance.
def __init__(self, field_with_rel):
self.field = field_with_rel
self.cache_name = self.field.get_cache_name()

@cached_property
def RelatedObjectDoesNotExist(self):
# The exception can't be created at initialization time since the
# related model might not be resolved yet; `rel.to` might still be
# a string model reference.
return type(
str('RelatedObjectDoesNotExist'),
(self.field.rel.to.DoesNotExist, AttributeError),
{}
)

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

def __get__(self, instance, instance_type=None):
if instance is None:
return self
try:
rel_obj = getattr(instance, self.cache_name)
except AttributeError:
val = self.field.get_local_related_value(instance)
if None in val:
rel_obj = None
else:
params = dict(
(rh_field.attname, getattr(instance, lh_field.attname))
for lh_field, rh_field in self.field.related_fields)
qs = self.get_queryset(instance=instance)
extra_filter = self.field.get_extra_descriptor_filter(instance)
if isinstance(extra_filter, dict):
params.update(extra_filter)
qs = qs.filter(**params)
else:
qs = qs.filter(extra_filter, **params)
# Assuming the database enforces foreign keys, this won't fail.
rel_obj = qs.get()
if not self.field.rel.multiple:
setattr(rel_obj, self.field.related.get_cache_name(), instance)
setattr(instance, self.cache_name, rel_obj)
if rel_obj is None and not self.field.null:
raise self.RelatedObjectDoesNotExist(
"%s has no %s." % (self.field.model.__name__, self.field.name)
)
else:
return rel_obj

问题在于这段代码:

    try:
val = getattr(obj, attr_name)
except related.ReverseSingleRelatedObjectDescriptor.RelatedObjectDoesNotExist:
val = None # Does not catch the thrown exception
except Exception as foo:
print type(foo) # Catches here, not above

不会捕获该异常

>>>print type(foo)
<class 'django.db.models.fields.related.RelatedObjectDoesNotExist'>
>>>isinstance(foo, related.FieldDoesNotExist)
False

except related.RelatedObjectDoesNotExist:

引发 AttributeError: 'module' 对象没有属性 'RelatedObjectDoesNotExist'

>>>isinstance(foo, related.ReverseSingleRelatedObjectDescriptor.RelatedObjectDoesNotExist)
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

这可能就是原因。

最佳答案

如果您的相关模型称为 Foo,您可以这样做:

except Foo.DoesNotExist:

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

根据 Django 文档:

DoesNotExist

exception Model.DoesNotExist

This exception is raised by the ORM when an expected object is notfound. For example, QuerySet.get() will raise it when no objectis found for the given lookups.

Django provides a DoesNotExist exception as an attribute ofeach model class to identify the class of object that could not befound, allowing you to catch exceptions for a particular model class.

The exception is a subclass of django.core.exceptions.ObjectDoesNotExist.

这就是实现这一目标的魔力。建立模型后,self.field.rel.to.DoesNotExist 就是该模型的不存在异常。

关于python - 你如何捕捉到这个异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26270042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com