Eclipse 2020 09插件开发如何实现自定义错误处理器
你的自定义错误处理器没有生效的核心原因是没有向Equinox运行时完成注册配置,默认系统仍在调用内置的WorkbenchErrorHandler。以下是完整的实现和配置方案:
第一步:完成扩展点注册
打开你插件项目的plugin.xml文件,添加org.eclipse.ui.statusHandlers扩展点配置,示例如下:
<extension point="org.eclipse.ui.statusHandlers"> <statusHandler class="de.audivw.jabaf.yourpackage.StatusHandler" id="de.audivw.jabaf.customStatusHandler" default="true"> </statusHandler> </extension>
注意把class属性值替换为你自己的StatusHandler类的全限定名,default="true"表示该处理器会覆盖系统默认的错误处理器。
第二步:优化现有实现代码
你当前的代码存在几个边界问题,调整后如下:
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.statushandlers.StatusAdapter; import org.eclipse.ui.statushandlers.WorkbenchErrorHandler; public class StatusHandler extends WorkbenchErrorHandler { private static final String TARGET_PLUGIN_ID = "de.audivw.jabaf"; @Override public void handle(final StatusAdapter statusAdapter, final int style) { IStatus status = statusAdapter.getStatus(); // 先判断是否是目标插件抛出的状态,不管是单条还是MultiStatus if (TARGET_PLUGIN_ID.equals(status.getPlugin())) { // 先校验Workbench已初始化,避免启动早期空指针 if (PlatformUI.isWorkbenchRunning()) { PlatformUI.getWorkbench().getDisplay().asyncExec(() -> { Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); ErrorDialog dialog = new ErrorDialog(shell, "Fehler", null, status, IStatus.WARNING | IStatus.ERROR); dialog.open(); }); return; } } // 非目标插件的错误走默认处理逻辑 super.handle(statusAdapter, style); } }
优化点说明:
- 新增Workbench运行状态校验,避免插件启动阶段调用PlatformUI.getWorkbench()抛出空指针
- 去掉了不必要的MultiStatus类型限定,单条错误状态也会被捕获处理
- 精简了ErrorDialog的状态掩码,不需要展示OK、INFO级别的通知
- 把插件ID提取为常量,降低维护成本
第三步:功能验证
在你的插件业务代码中主动触发一条错误测试是否生效:
import org.eclipse.core.runtime.Status; import org.eclipse.ui.statushandlers.StatusManager; // 测试触发错误 Status testStatus = new Status(IStatus.ERROR, TARGET_PLUGIN_ID, "测试自定义错误对话框"); StatusManager.getManager().handle(testStatus, StatusManager.SHOW);
运行插件后触发上述代码,即可看到你自定义的错误对话框弹出。
内容的提问来源于stack exchange,提问作者tobias
相关产品推荐
相关产品推荐

