Data binding e4数据绑定转换器异常未捕获
我创建了一个自定义转换器,将字符串转换回日期Data binding e4数据绑定转换器异常未捕获,data-binding,eclipse-rcp,jface,e4,Data Binding,Eclipse Rcp,Jface,E4,我创建了一个自定义转换器,将字符串转换回日期 public Object convert(Object fromObject){ if (fromObject != null && fromObject.toString().trim().length() == 0){ return null; } for (DateFormat f : formats){ try{ return f.parse(fromO
public Object convert(Object fromObject){
if (fromObject != null && fromObject.toString().trim().length() == 0){
return null;
}
for (DateFormat f : formats){
try{
return f.parse(fromObject.toString());
}catch (ParseException e){
// Ignore
}
}
throw new RuntimeException(message);
}
基本上,如果字符串不可解析,将抛出RuntimeException
我已经将转换器添加到数据绑定中的更新策略中,并且正在调用它
问题在于何时抛出异常。例如,当我开始在文本字段中键入日期时。该异常不是显示decorator字段以指示输入中的错误,而是不捕获
异常出现在控制台日志中。日志中的错误出现在问题的末尾,因为似乎没有人发现它
我错过了什么?转换器中的异常应该在updateStrategy中捕获并显示错误,不是吗
!!条目org.eclipse.core.databinding 4 0 2017-08-18 15:16:27.816
!消息时间格式无效
!堆栈0
java.lang.RuntimeException:时间格式无效
位于com.lsespace.earthcare.tds.gui.util.databinding.conversion.StringToJavaTimeTagConverter.convertStringToJavaTimeTagConverter.java:21
位于org.eclipse.core.databinding.UpdateStrategy.convertUpdateStrategy.java:715
位于org.eclipse.core.databinding.UpdateValueStrategy.convertUpdateValueStrategy.java:1
位于org.eclipse.core.databinding.ValueBinding$3.runValueBinding.java:175
位于org.eclipse.core.databinding.observable.Realm$1.runRealm.java:149
位于org.eclipse.core.runtime.SafeRunner.runSafeRunner.java:42
位于org.eclipse.core.databinding.observable.Realm.safeRunRealm.java:153
位于org.eclipse.core.databinding.observable.Realm.execRealm.java:171
位于org.eclipse.core.databinding.ValueBinding.doUpdateValueBinding.java:158
在org.eclipse.core.databinding.ValueBinding.access$4ValueBinding.java:147
位于org.eclipse.core.databinding.ValueBinding$1.handleValueChangeValueBinding.java:46
位于org.eclipse.core.databinding.observable.value.ValueChangeEvent.dispatchValueChangeEvent.java:70
位于org.eclipse.core.databinding.observable.ChangeManager.fireventchangemanager.java:117
在org.eclipse.core.databinding.observable.value.decormingObservableValue.FireValueChangeDecormingObservableValue.java:61
位于org.eclipse.core.databinding.observable.value.decormingObservableValue.HandleValueChangeDecormingObservableValue.java:103
位于org.eclipse.core.databinding.observable.value.decormingObservableValue$1.handleValueChangeDecormingObservableValue.java:76
位于org.eclipse.core.databinding.observable.value.ValueChangeEvent.dispatchValueChangeEvent.java:70
位于org.eclipse.core.databinding.observable.ChangeManager.fireventchangemanager.java:117
位于org.eclipse.core.databinding.observable.value.AbstractObservalEvalue.FireValueChangeAbstractObservalEvalue.java:82
位于org.eclipse.core.internal.databinding.property.value.SimplePropertyObserveValue.NotifyIfChangedSimplePropertyObserveValue.java:126
位于org.eclipse.core.internal.databinding.property.value.SimplePropertyObserveValue.access$3SimplePropertyObserveValue.java:118
位于org.eclipse.core.internal.databinding.property.value.SimplePropertyObserveValue$1$1.runSimplePropertyObserveValue.java:70
位于org.eclipse.core.databinding.observable.Realm$1.runRealm.java:149
位于org.eclipse.core.runtime.SafeRunner.runSafeRunner.java:42
位于org.eclipse.core.databinding.observable.Realm.safeRunRealm.java:153
位于org.eclipse.core.databinding.observable.Realm.execRealm.java:171
位于org.eclipse.core.internal.databinding.property.value.SimplePropertyObserveValue$1.HandleEventsImplePropertyObserveValue.java:66
位于org.eclipse.core.databinding.property.NativePropertyListener.fireChangeNativePropertyListener.java:69
位于org.eclipse.jface.internal.databinding.swt.WidgetListener.handleEventWidgetListener.java:56
位于org.eclipse.swt.widgets.EventTable.sendEventTable.java:84
位于org.eclipse.swt.widgets.Display.sendEventDisplay.java:4410
位于org.eclipse.swt.widgets.Widget.sendEventWidget.java:1079
位于org.eclipse.swt.widgets.Widget.sendEventWidget.java:1103
位于org.eclipse.swt.widgets.Widget.sendEventWidget.java:1084
位于org.eclipse.swt.widgets.Text.wmCommandChildText.java:3117
位于org.eclipse.swt.widgets.Control.WM_COMMANDControl.java:4939
位于org.eclipse.swt.widgets.Control.windowProcControl.java:4794
位于org.eclipse.swt.widgets.Display.windowProcDisplay.java:5115
在org.eclipse.swt.internal.win32.OS.CallWindowProcWNative方法中
位于org.eclipse.swt.internal.win32.OS.CallWindowProcOS.java:2446
位于org.eclipse.swt.widgets.Text.callWindowProcText.java:262
位于org.eclipse.swt.widgets.Control.windowProcControl.java:4889
位于org.eclipse.swt.widgets.Text.windowProcText.java:2704
位于org.eclipse.swt.widgets.Display.windowProcDisplay.java:5102
在org.eclipse.swt.internal.win32.OS.dispatchMessageWnactive方法中
在组织
.eclipse.swt.internal.win32.OS.DispatchMessageOS.java:2552
位于org.eclipse.swt.widgets.Display.readAndDispatchDisplay.java:3814
位于org.eclipse.jface.window.window.runEventLoopWindow.java:818
位于org.eclipse.jface.window.window.openWindow.java:794
位于com.lsespace.earthcare.tds.gui.jface.actions.EditConfigAction.runEditConfigAction.java:39
位于org.eclipse.jface.action.action.runWithEventAction.java:473
位于org.eclipse.jface.action.ActionContributionItem.handleWidgetSelectionActionContributionItem.java:565
在org.eclipse.jface.action.ActionContributionItem.lambda$5ActionContributionItem.java:436
在org.eclipse.jface.action.ActionContributionItem$$Lambda$57/765702264.handleEventUnknown Source上
位于org.eclipse.swt.widgets.EventTable.sendEventTable.java:84
位于org.eclipse.swt.widgets.Display.sendEventDisplay.java:4410
位于org.eclipse.swt.widgets.Widget.sendEventWidget.java:1079
位于org.eclipse.swt.widgets.Display.runDeferredEventsDisplay.java:4228
位于org.eclipse.swt.widgets.Display.readAndDispatchDisplay.java:3816
位于org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.runPartRenderingEngine.java:1121
位于org.eclipse.core.databinding.observable.Realm.runWithDefaultRealm.java:336
位于org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.runPartRenderingEngine.java:1022
位于org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUIE4Workbench.java:150
位于org.eclipse.e4.ui.internal.workbench.swt.E4Application.startE4Application.java:161
在org.eclipse.equinox.internal.app.eclipseeapphandle.runEclipseAppHandle.java:196
位于org.eclipse.core.runtime.internal.adapter.eclipseeappluncher.runapplicationclipseappluncher.java:134
位于org.eclipse.core.runtime.internal.adapter.eclipseeappluncher.starteclipseappluncher.java:104
java:388
位于org.eclipse.core.runtime.adapter.EclipseStarter.runEclipseStarter.java:243
在sun.reflect.NativeMethodAccessorImpl.invoke0Native方法中
位于sun.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62
在sun.reflect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43
位于java.lang.reflect.Method.invokeMethod.java:497
位于org.eclipse.equinox.launcher.Main.invokeFrameworkMain.java:673
位于org.eclipse.equinox.launcher.Main.basicRunMain.java:610
位于org.eclipse.equinox.launcher.Main.runMain.java:1519
位于org.eclipse.equinox.launcher.Main.mainMain.java:1492
这是我使用的UpdateStrategy的实现,因此转换器中的异常被视为验证异常
/**
* This implementation of UpdateValueStrategy does not catch the exceptions thrown by the converter,
* thus letting the normal mechanism of ValueBinding deal with the exception as it will do with a
* validation exception.
*
*/
public class AlternativeUpdateValueStrategy extends UpdateValueStrategy {
public AlternativeUpdateValueStrategy() {
this(UpdateValueStrategy.POLICY_UPDATE);
}
public AlternativeUpdateValueStrategy(int updateStrategy) {
super(updateStrategy);
}
@Override
public Object convert(Object value) {
if (converter != null) {
return converter.convert(value);
}
return value;
}
}
您认为应该显示异常的原因是什么?UpdateStrategy确实捕获异常,但只记录错误。顺便说一句,这与e4无关。例如,我在这里看到的:在转换器中抛出异常与我想使用它的目的相同。另外,您将如何向用户通知转换错误?还有其他方法吗?在检查eclipse源代码之后,很明显org.eclipse.core.databinding.ValueBinding.doUpdateValueBinding.java:158应该捕获异常,因为在try-and-catch块中调用转换there@greg-好的,现在我明白你的意思了。我将创建自己的UpdateStrategy,以便UpdateStrategy不会捕获异常,而是像我预期的那样通过ValueBinding捕获异常。它已经有一个漏洞:您应该使用验证器来报告无效数据。