在交互式Python会话中,如何确定在哪个模块中定义了给定的异常?
我正在寻找一个可以只使用python shell执行的解决方案,以避免在我的开发环境和浏览器之间切换上下文,并拥有一个能很好地适用于文档不足的包的解决方案。
我的具体案例是:我正在开发一个Django应用程序。Django框架ORM在试图从不存在的DB中获取对象时会引发DoesNotExist
错误。为了捕获该异常,我需要确定它在哪里定义,以便导入该模块。
# make a new UUID just to ensure that the exception is raised
In [4]: models.Selection.objects.get(pk=uuid.uuid4())
---------------------------------------------------------------------------
DoesNotExist Traceback (most recent call last)
<ipython-input-4-aeb92642cdc2> in <module>
----> 1 models.Selection.objects.get(pk=uuid.uuid4())
~/app-dev/lib/python3.8/site-packages/django/db/models/manager.py in manager_method(self, *args, **kwargs)
83 def create_method(name, method):
84 def manager_method(self, *args, **kwargs):
---> 85 return getattr(self.get_queryset(), name)(*args, **kwargs)
86 manager_method.__name__ = method.__name__
87 manager_method.__doc__ = method.__doc__
~/app-dev/lib/python3.8/site-packages/django/db/models/query.py in get(self, *args, **kwargs)
433 return clone._result_cache[0]
434 if not num:
--> 435 raise self.model.DoesNotExist(
436 "%s matching query does not exist." %
437 self.model._meta.object_name
DoesNotExist: Selection matching query does not exist.
# in the shell, how do I figure out what module defines the DoesNotExist exception?
我知道,在这种特定的情况下,我可以搜索Django文档,但同样想要一种通用的、非基于浏览器的方法。
只需捕获任何异常,然后打印出异常的类型:
In [7]: try:
...: models.Selection.objects.get(pk=uuid.uuid4())
...: except Exception as e:
...: print(type(e))
<class 'channels.models.Selection.DoesNotExist'>