From 67322aee63d497bdacaaa4fdb934370d4f47881a Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 12 Aug 2016 15:19:13 +0300 Subject: [PATCH] suppress exceptions from providers --- .../engine/CompoundPositionManager.java | 22 ++++++------- .../debugger/engine/DebugProcessImpl.java | 4 ++- .../debugger/impl/DebuggerUtilsImpl.java | 33 +++++++++++++++++++ 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java b/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java index 68ee9f2c92f4..905cf758dbef 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java @@ -21,12 +21,12 @@ import com.intellij.debugger.PositionManager; import com.intellij.debugger.SourcePosition; import com.intellij.debugger.engine.evaluation.EvaluationContext; import com.intellij.debugger.impl.DebuggerUtilsEx; +import com.intellij.debugger.impl.DebuggerUtilsImpl; import com.intellij.debugger.jdi.StackFrameProxyImpl; import com.intellij.debugger.requests.ClassPrepareRequestor; import com.intellij.execution.filters.LineNumbersMapping; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.util.ThreeState; @@ -69,19 +69,17 @@ public class CompoundPositionManager extends PositionManagerEx implements MultiR private T iterate(Processor processor, T defaultValue, SourcePosition position) { for (PositionManager positionManager : myPositionManagers) { - try { - if (position != null) { - Set types = positionManager.getAcceptedFileTypes(); - if (types != null && !types.contains(position.getFile().getFileType())) { - continue; - } + if (position != null) { + Set types = positionManager.getAcceptedFileTypes(); + if (types != null && !types.contains(position.getFile().getFileType())) { + continue; } - return processor.process(positionManager); } - catch (NoDataException | ProcessCanceledException ignored) {} - catch (VMDisconnectedException | ObjectCollectedException e) {throw e;} - catch (InternalException e) {LOG.info(e);} - catch (Exception | AssertionError e) {LOG.error(e);} + try { + return DebuggerUtilsImpl.suppressExceptions(() -> processor.process(positionManager), defaultValue, NoDataException.class); + } + catch (NoDataException ignored) { + } } return defaultValue; } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index abe5a7b9e36b..01495be33406 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -222,7 +222,9 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb } return myNodeRenderersMap.computeIfAbsent(type, t -> - myRenderers.stream().filter(r -> r.isApplicable(type)).findFirst().orElseGet(() -> getDefaultRenderer(type))); + myRenderers.stream(). + filter(r -> DebuggerUtilsImpl.suppressExceptions(() -> r.isApplicable(type), false)). + findFirst().orElseGet(() -> getDefaultRenderer(type))); } @NotNull diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java index 1ed050b5f4e9..2738e5e6384b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java @@ -34,6 +34,7 @@ import com.intellij.ide.util.TreeClassChooser; import com.intellij.ide.util.TreeClassChooserFactory; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.JDOMExternalizerUtil; import com.intellij.openapi.util.Pair; @@ -45,6 +46,9 @@ import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; import com.intellij.util.xmlb.XmlSerializer; import com.intellij.xdebugger.XExpression; import com.intellij.xdebugger.impl.breakpoints.XExpressionState; +import com.sun.jdi.InternalException; +import com.sun.jdi.ObjectCollectedException; +import com.sun.jdi.VMDisconnectedException; import com.sun.jdi.Value; import com.sun.jdi.connect.spi.TransportService; import org.jdom.Element; @@ -212,4 +216,33 @@ public class DebuggerUtilsImpl extends DebuggerUtilsEx{ public static boolean isRemote(DebugProcess debugProcess) { return Boolean.TRUE.equals(debugProcess.getUserData(BatchEvaluator.REMOTE_SESSION_KEY)); } + + public interface SupplierThrowing { + T get() throws E; + } + + public static T suppressExceptions(SupplierThrowing supplier, T defaultValue) throws E { + return suppressExceptions(supplier, defaultValue, null); + } + + public static T suppressExceptions(SupplierThrowing supplier, + T defaultValue, + Class rethrow) throws E { + try { + return supplier.get(); + } + catch (ProcessCanceledException ignored) {} + catch (VMDisconnectedException | ObjectCollectedException e) {throw e;} + catch (InternalException e) {LOG.info(e);} + catch (Exception | AssertionError e) { + if (rethrow != null && rethrow.isInstance(e)) { + throw e; + } + else { + LOG.error(e); + } + } + return defaultValue; + } + } \ No newline at end of file