Bug 95335  -  Source Lookup Halts With Missing Archive
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupParticipant.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupParticipant.java
index 3c90619..9f28888 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupParticipant.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupParticipant.java
@@ -14,6 +14,10 @@
 import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
 
 
 /**
@@ -48,6 +52,8 @@
 	 */
 	public Object[] findSourceElements(Object object) throws CoreException {
 		List results = null;
+		CoreException single = null;
+		MultiStatus multiStatus = null;
 		if (isFindDuplicates()) {
 			results = new ArrayList();
 		}
@@ -55,25 +61,41 @@
 		if (name != null) {
 			ISourceContainer[] containers = getSourceContainers();
 			for (int i = 0; i < containers.length; i++) {
-				ISourceContainer container = getDelegateContainer(containers[i]);
-				if (container != null) {
-					Object[] objects = container.findSourceElements(name);
-					if (objects.length > 0) {
-						if (isFindDuplicates()) {
-							for (int j = 0; j < objects.length; j++) {
-								results.add(objects[j]);
+				try {
+					ISourceContainer container = getDelegateContainer(containers[i]);
+					if (container != null) {
+						Object[] objects = container.findSourceElements(name);
+						if (objects.length > 0) {
+							if (isFindDuplicates()) {
+								for (int j = 0; j < objects.length; j++) {
+									results.add(objects[j]);
+								}
+							} else {
+								if (objects.length == 1) {
+									return objects;
+								} 
+								return new Object[]{objects[0]};
 							}
-						} else {
-							if (objects.length == 1) {
-								return objects;
-							} 
-							return new Object[]{objects[0]};
 						}
 					}
+				} catch (CoreException e) {
+					if (single == null) {
+						single = e;
+					} else if (multiStatus == null) {
+						multiStatus = new MultiStatus(DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, new IStatus[]{single.getStatus()}, SourceLookupMessages.CompositeSourceContainer_0, null); //$NON-NLS-1$
+						multiStatus.add(e.getStatus());
+					} else {
+						multiStatus.add(e.getStatus());
+					}
 				}
 			}
 		}
 		if (results == null) {
+			if (multiStatus != null) {
+				throw new CoreException(multiStatus);
+			} else if (single != null) {
+				throw single;
+			}
 			return EMPTY;
 		}
 		return results.toArray();