Copyright (c) 2005, 2009 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
/*******************************************************************************
* Copyright (c) 2005, 2009 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.runtime;
import org.eclipse.core.internal.runtime.*;
import org.eclipse.osgi.util.NLS;
Runs the given ISafeRunnable in a protected mode: exceptions and certain
errors thrown in the runnable are logged and passed to the runnable's
exception handler. Such exceptions are not rethrown by this method.
This class can be used without OSGi running.
Since: org.eclipse.equinox.common 3.2
/**
* Runs the given ISafeRunnable in a protected mode: exceptions and certain
* errors thrown in the runnable are logged and passed to the runnable's
* exception handler. Such exceptions are not rethrown by this method.
* <p>
* This class can be used without OSGi running.
* </p>
* @since org.eclipse.equinox.common 3.2
*/
public final class SafeRunner {
Runs the given runnable in a protected mode. Exceptions
thrown in the runnable are logged and passed to the runnable's
exception handler. Such exceptions are not rethrown by this method.
In addition to catching all Exception
types, this method also catches certain Error
types that typically result from programming errors in the code being executed. Severe errors that are not generally safe to catch are not caught by this method.
Params: - code – the runnable to run
/**
* Runs the given runnable in a protected mode. Exceptions
* thrown in the runnable are logged and passed to the runnable's
* exception handler. Such exceptions are not rethrown by this method.
* <p>
* In addition to catching all {@link Exception} types, this method also catches certain {@link Error}
* types that typically result from programming errors in the code being executed.
* Severe errors that are not generally safe to catch are not caught by this method.
* </p>
*
* @param code the runnable to run
*/
public static void run(ISafeRunnable code) {
Assert.isNotNull(code);
try {
code.run();
} catch (Exception | LinkageError | AssertionError e) {
handleException(code, e);
}
}
private static void handleException(ISafeRunnable code, Throwable e) {
if (!(e instanceof OperationCanceledException)) {
// try to obtain the correct plug-in id for the bundle providing the safe runnable
Activator activator = Activator.getDefault();
String pluginId = null;
if (activator != null)
pluginId = activator.getBundleId(code);
if (pluginId == null)
pluginId = IRuntimeConstants.PI_COMMON;
String message = NLS.bind(CommonMessages.meta_pluginProblems, pluginId);
IStatus status;
if (e instanceof CoreException) {
status = new MultiStatus(pluginId, IRuntimeConstants.PLUGIN_ERROR, message, e);
((MultiStatus) status).merge(((CoreException) e).getStatus());
} else {
status = new Status(IStatus.ERROR, pluginId, IRuntimeConstants.PLUGIN_ERROR, message, e);
}
// Make sure user sees the exception: if the log is empty, log the exceptions on stderr
if (!RuntimeLog.isEmpty())
RuntimeLog.log(status);
else
e.printStackTrace();
}
code.handleException(e);
}
}