我如何弄清楚在交互式会话期间哪个模块定义了异常



在交互式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'>

最新更新