Source:
<code>protected void internalStart(Map<String, String> startOptions) throws InfrastructureException { startSynchronizer.setStartThread(); DockerEnvironment dockerEnvironment = getContext().getDockerEnvironment(); Queue<String> startQueue = new ArrayDeque<>(getContext().getOrderedContainers()); try { networks.createNetwork(getContext().getDockerEnvironment().getNetwork()); boolean restore = isRestoreEnabled(startOptions); String machineName = startQueue.peek(); while (machineName != null) { DockerContainerConfig container = dockerEnvironment.getContainers().get(machineName); checkInterruption(); sendStartingEvent(machineName); try { <START> if (restore) { <END> restoreMachine(machineName, container); } else { startMachine(machineName, container); } checkInterruption(); sendRunningEvent(machineName); } catch (InfrastructureException e) { checkInterruption(); sendFailedEvent(machineName, e.getMessage()); throw e; } startQueue.poll(); machineName = startQueue.peek(); } } catch (InfrastructureException | InterruptedException | RuntimeException e) { boolean interrupted = e instanceof InterruptedException || Thread.interrupted(); try { destroyRuntime(null); } catch (Exception destExc) { LOG.error(destExc.getLocalizedMessage(), destExc); } if (interrupted) { InfrastructureException ex = new RuntimeStartInterruptedException(getContext().getIdentity()); startSynchronizer.exception = ex; throw ex; } startSynchronizer.exception = e; if (e instanceof InfrastructureException) { throw (InfrastructureException)e; } throw new InternalInfrastructureException(e.getLocalizedMessage(), e); } finally { startSynchronizer.release(); } }</code><technical_language>elaborate behavior if RuntimeStartInterruptedException is caught</technical_language>

Target:
protected void internalStart(Map<String, String> startOptions) throws InfrastructureException { startSynchronizer.setStartThread(); Map<String, DockerContainerConfig> machineName2config = getContext().getDockerEnvironment().getContainers(); try { networks.createNetwork(getContext().getDockerEnvironment().getNetwork()); final boolean restore = isRestoreEnabled(startOptions); for (String machineName : getContext().getOrderedContainers()) { checkInterruption(); final DockerContainerConfig config = machineName2config.get(machineName); sendStartingEvent(machineName); try { if (restore) { restoreMachine(machineName, config); } else { startMachine(machineName, config); } sendRunningEvent(machineName); } catch (InfrastructureException e) { sendFailedEvent(machineName, e.getMessage()); throw e; } } startSynchronizer.complete(); } catch (InfrastructureException | InterruptedException | RuntimeException e) { boolean interrupted = Thread.interrupted() || e instanceof InterruptedException; try { destroyRuntime(emptyMap()); } catch (InternalInfrastructureException destExc) { LOG.error(destExc.getMessage(), destExc); } catch (InfrastructureException ignore) { } if (interrupted) { final RuntimeStartInterruptedException ex = new RuntimeStartInterruptedException(getContext().getIdentity()); startSynchronizer.completeExceptionally(ex); throw ex; } startSynchronizer.completeExceptionally(e); try { throw e; } catch (InfrastructureException rethrow) { throw rethrow; } catch (Exception wrap) { throw new InternalInfrastructureException(e.getMessage(), wrap); } } }