在我的RCP应用程序中,当我关闭并重新打开PyDev项目时,PyDev在控制台上抛出异常,抱怨项目资源不存在。一切似乎都在后面工作,但我当然想避免给我的用户显示一个虚假的例外。PyDev抛出异常“资源不存在”当重新打开项目
尽我所知,通过浏览堆栈跟踪,PyDev的内容提供者期望项目资源存在,而不是。也许我应该在PyDev中调用一些API,当我检测到项目关闭时?或者这是一个错误?我注意到版本5.1.2的问题,但升级到最新版本(5.4.0)没有解决它。
编辑:
我发现,通过right-click on project -> Open Project
开盘项目并不抛出异常。只有在双击它才能打开项目时。双击打开的项目不会导致问题,只需双击关闭的项目即可。在框架有机会实际打开项目之前,似乎PyDev重新定位动作(PyOpenPythonFileAction)正在被调用。
编辑2:
其实它比这更奇怪。抛出异常的重定向操作是PyOpenResourceAction
(但是它的run()
实现在超类PyOpenPythonFileAction
中失败)。在if (viewer.isExpandable(container)) {
的第110行抛出异常。那里的eclipse资源代码正在检查某些标志位的资源类型,我不知道它为什么返回false。我让一个警卫只检查类型为Project的资源,并且该项目存在且已打开,但仍然失败。
EDIT3:
在PyOpenPythonFileAction
,包装
if (viewer.isExpandable(container)) {
viewer.setExpandedState(container, !viewer.getExpandedState(container));
}
在UIJob
,给它一个500毫秒的延迟,似乎解决它。
以下是带有堆栈跟踪的控制台输出。被关闭并重新开放的项目被命名为“站点”。
ENTRY org.python.pydev.shared_core 1 1 2016年12月6日16:31:28.037 消息资源 '/网站' 不存在。 !STACK 1 org.eclipse.core.internal.resources.ResourceException:资源'/ site'不存在。 at org.eclipse.core.internal.resources.Resource.checkExists(Resource.java:335) at org.eclipse.core.internal.resources.Resource.checkAccessible(Resource.java:209) at org.eclipse。 core.internal.resources.Project.checkAccessible(Project.java:141) at org.eclipse.core.internal.resources.Project.hasNature(Project.java:521) at org.eclipse.core.internal.resources。 Project.getNature(Project.java:405) at org.python.pydev.plugin.nature.PythonNature.getPythonNature(PythonNature.java:809) at org.python.pydev.navigator.PythonBaseModelProvider.getChildrenForIResourceOrWorkingSet(PythonBaseModelProvider.java: 611) at org.python.pydev.navigator.PythonBaseModelProvider.getChildren(PythonBaseModelProvider.java:535) at org.python.pydev.navigator.PythonModelProvider.getChildren(PythonModelProvider.java:63) at org.python.pydev.navigator.PythonBaseModelProvider.hasChildren(PythonBaseModelProvider.java:510) at org.eclipse.ui.internal.navigator .extensions.SafeDelegateTreeContentProvider。hasChildren(SafeDelegateTreeContentProvider.java:112) 在org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.callNormalHasChildren(NavigatorContentServiceContentProvider.java:444) 在org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.pipelineHasChildren(NavigatorContentServiceContentProvider.java: 463) 在org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.access $ 5(NavigatorContentServiceContentProvider.java:447) 在org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider $ 3.run(NavigatorContentServiceContentProvider.java:413) 在org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.hasChildren(NavigatorContentServiceContentProvider.j AVA:392) 在org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.hasChildren(NavigatorContentServiceContentProvider.java:436) 在org.eclipse.jface.viewers.AbstractTreeViewer.isExpandable(AbstractTreeViewer.java:2128) 在有机eclipse.jface.viewers.TreeViewer.isExpandable(TreeViewer.java:538) at org.python.pydev.navigator.actions.PyOpenPythonFileAction.run(PyOpenPythonFileAction.java:110) at org.eclipse.ui.actions.RetargetAction。运行(RetargetAction.java:225) at org.eclipse.ui.navigator.CommonNavigatorManager $ 2.open(CommonNavigatorManager.java:191) at org.eclipse.ui.OpenAndLinkWithEditorHelper $ InternalListener.open(OpenAndLinkWithEditorHelper.java:46) 在org.eclipse.jface.viewers.StructuredViewer $ 2.run(Structure dViewer.java:855) 在org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 在org.eclipse.ui.internal.JFaceUtil $ 1.run(JFaceUtil.java:50) 在组织.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:173) at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:852) at org.eclipse.jface.viewers.StructuredViewer.handleOpen (StructuredViewer.java:1169) 在org.eclipse.ui.navigator.CommonViewer.handleOpen(CommonViewer.java:451) 在org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:278) 在有机.eclipse.jface.util.OpenStrategy.access $ 2(OpenStrategy.java:272) at org.eclipse.jface.util.OpenStrategy $ 1.handleEvent(OpenStrategy.java:313) 在org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5219) at org.eclipse.swt.widgets。 Widget.sendEvent(Widget.java:1340) 在org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4553) 在org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4143) 在org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine $ 4.run(PartRenderingEngine.java:1121) 在org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) at org.eclipse.ui.internal.Workbench $ 5.run(Workbench.java:687) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.ui .internal.Workbench.createAndRunWorkbench(Workbench.java:604) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) at my.package.MyApplication.start(MyApplication.java:137) at org .eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core .runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter。的java:388) 在org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl .java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.eclipse.equinox.launcher.Main .invokeFramework(Main.java:673) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) at org.eclipse.equinox.launcher.Main.run(Main.java:1519) at org.eclipse.equinox.launcher.Main.main(Main.java:1492) !SUBENTRY 1 org.eclipse.core.resources 4 368 2016-12 -06 16:31:28.095 !MESSAGE资源'/ site'不存在。
谢谢,但没有什么.project文件似乎有助于删除它。我尝试删除所有的系统库,删除解释器本身,从项目中删除pydev的性质。我仍然得到一个PyDev异常打开该项目。使其不发生的唯一方法是在自定义视图...内容选项卡中从项目资源管理器中排除PyDev导航器内容。当然,这只是从资源管理器中删除Pyev功能 – MidnightJava
通过堆栈跟踪,它看起来像PyDev正在尝试检查项目是否具有PyDev性质,并且资源无法访问。那里的eclipse资源代码表示该项目必须存在并且可以为其开放。但是PyDev在得到性质(PythonBaseModelProvider行610-612)之前检查它,所以我不知道为什么访问失败。在项目启动之前,PyDev的Comman Navigator贡献似乎正在检查一个它曾经知道的项目。这就是为什么我想知道我是否需要在某处注销某些东西。 – MidnightJava
我想我可能已经发现了这个问题。它看起来像我加入的DeleteParticipant导致了这个问题。我在测试中删除了资源更改侦听器,但忽略了删除参与者。我稍后会发布关于我的代码在做什么导致问题的具体描述。 – MidnightJava