【问题标题】:e4 databinding converter exception not catche4 数据绑定转换器异常未捕获
【发布时间】:2017-08-18 13:31:58
【问题描述】:

我创建了一个自定义转换器来将字符串转换回日期。

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。

我已将转换器添加到数据搜索中的更新策略中,并且正在调用它。

问题在于何时抛出异常。 (例如,当我开始在 TextFiled 中键入日期时)。不是出现装饰器字段来指示输入中的错误,而是不会捕获异常。

控制台日志中出现异常(日志中的错误在问题的末尾),因为似乎没有人发现它。

我错过了什么?转换器中的异常应该在 updateStrategy 中捕获并显示错误,不是吗?

!ENTRY org.eclipse.core.databinding 4 0 2017-08-18 15:16:27.816 !MESSAGE 时间格式无效 !堆栈 0 java.lang.RuntimeException:时间格式无效 在 com.lsespace.earthcare.tds.gui.util.databinding.conversion.StringToJavaTimeTagConverter.convert(StringToJavaTimeTagConverter.java:21) 在 org.eclipse.core.databinding.UpdateStrategy.convert(UpdateStrategy.java:715) 在 org.eclipse.core.databinding.UpdateValueStrategy.convert(UpdateValueStrategy.java:1) 在 org.eclipse.core.databinding.ValueBinding$3.run(ValueBinding.java:175) 在 org.eclipse.core.databinding.observable.Realm$1.run(Realm.java:149) 在 org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 在 org.eclipse.core.databinding.observable.Realm.safeRun(Realm.java:153) 在 org.eclipse.core.databinding.observable.Realm.exec(Realm.java:171) 在 org.eclipse.core.databinding.ValueBinding.doUpdate(ValueBinding.java:158) 在 org.eclipse.core.databinding.ValueBinding.access$4(ValueBinding.java:147) 在 org.eclipse.core.databinding.ValueBinding$1.handleValueChange(ValueBinding.java:46) 在 org.eclipse.core.databinding.observable.value.ValueChangeEvent.dispatch(ValueChangeEvent.java:70) 在 org.eclipse.core.databinding.observable.ChangeManager.fireEvent(ChangeManager.java:117) 在 org.eclipse.core.databinding.observable.value.DecoratingObservableValue.fireValueChange(DecoratingObservableValue.java:61) 在 org.eclipse.core.databinding.observable.value.DecoratingObservableValue.handleValueChange(DecoratingObservableValue.java:103) 在 org.eclipse.core.databinding.observable.value.DecoratingObservableValue$1.handleValueChange(DecoratingObservableValue.java:76) 在 org.eclipse.core.databinding.observable.value.ValueChangeEvent.dispatch(ValueChangeEvent.java:70) 在 org.eclipse.core.databinding.observable.ChangeManager.fireEvent(ChangeManager.java:117) 在 org.eclipse.core.databinding.observable.value.AbstractObservableValue.fireValueChange(AbstractObservableValue.java:82) 在 org.eclipse.core.internal.databinding.property.value.SimplePropertyObservableValue.notifyIfChanged(SimplePropertyObservableValue.java:126) 在 org.eclipse.core.internal.databinding.property.value.SimplePropertyObservableValue.access$3(SimplePropertyObservableValue.java:118) 在 org.eclipse.core.internal.databinding.property.value.SimplePropertyObservableValue$1$1.run(SimplePropertyObservableValue.java:70) 在 org.eclipse.core.databinding.observable.Realm$1.run(Realm.java:149) 在 org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 在 org.eclipse.core.databinding.observable.Realm.safeRun(Realm.java:153) 在 org.eclipse.core.databinding.observable.Realm.exec(Realm.java:171) 在 org.eclipse.core.internal.databinding.property.value.SimplePropertyObservableValue$1.handleEvent(SimplePropertyObservableValue.java:66) 在 org.eclipse.core.databinding.property.NativePropertyListener.fireChange(NativePropertyListener.java:69) 在 org.eclipse.jface.internal.databinding.swt.WidgetListener.handleEvent(WidgetListener.java:56) 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 在 org.eclipse.swt.widgets.Display.sendEvent(Display.java:4410) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1084) 在 org.eclipse.swt.widgets.Text.wmCommandChild(Text.java:3117) 在 org.eclipse.swt.widgets.Control.WM_COMMAND(Control.java:4939) 在 org.eclipse.swt.widgets.Control.windowProc(Control.java:4794) 在 org.eclipse.swt.widgets.Display.windowProc(Display.java:5115) 在 org.eclipse.swt.internal.win32.OS.CallWindowProcW(本机方法) 在 org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2446) 在 org.eclipse.swt.widgets.Text.callWindowProc(Text.java:262) 在 org.eclipse.swt.widgets.Control.windowProc(Control.java:4889) 在 org.eclipse.swt.widgets.Text.windowProc(Text.java:2704) 在 org.eclipse.swt.widgets.Display.windowProc(Display.java:5102) 在 org.eclipse.swt.internal.win32.OS.DispatchMessageW(本机方法) 在 org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3814) 在 org.eclipse.jface.window.Window.runEventLoop(Window.java:818) 在 org.eclipse.jface.window.Window.open(Window.java:794) 在 com.lsespace.earthcare.tds.gui.jface.actions.EditConfigAction.run(EditConfigAction.java:39) 在 org.eclipse.jface.action.Action.runWithEvent(Action.java:473) 在 org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565) 在 org.eclipse.jface.action.ActionContributionItem.lambda$5(ActionContributionItem.java:436) 在 org.eclipse.jface.action.ActionContributionItem$$Lambda$57/765702264.handleEvent(未知来源) 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 在 org.eclipse.swt.widgets.Display.sendEvent(Display.java:4410) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) 在 org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4228) 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3816) 在 org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) 在 org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) 在 org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) 在 org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) 在 org.eclipse.e4.ui.internal.workbench.swt.E4Application.start(E4Application.java:161) 在 org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) 在 org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) 在 org.eclipse.equinox.launcher.Main.run(Main.java:1519) 在 org.eclipse.equinox.launcher.Main.main(Main.java:1492)

【问题讨论】:

  • 是什么让您认为应该显示异常? UpdateStrategy 确实捕获了异常,但只记录了错误。顺便说一句,这与 e4 无关。
  • 例如我在这里看到的:tomsondev.bestsolution.at/2009/06/15/… 在转换器中抛出异常用于我想使用它的相同目的。另外,您如何将转换错误通知给用户?还有其他方法吗?
  • 检查 eclipse 源代码后,很明显 org.eclipse.core.databinding.ValueBinding.doUpdate(ValueBinding.java:158) 应该捕获异常,因为在 try 中调用了转换,并且在那里抓块
  • @greg-449 好的,现在我明白你的意思了。我将创建自己的 UpdateStrategy,这样异常不会被 UpdateStrategy 捕获,而是像我预期的那样被 ValueBinding 捕获。已经有一个关于它的错误:bugs.eclipse.org/bugs/show_bug.cgi?id=495789
  • 您应该使用验证器来报告无效数据。

标签: data-binding eclipse-rcp jface e4


【解决方案1】:

这是我使用的 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;
 }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2015-01-07
    • 1970-01-01
    • 2017-05-24
    • 2010-09-28
    • 2014-06-03
    相关资源
    最近更新 更多