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捕获异常。它已经有一个漏洞:您应该使用验证器来报告无效数据。