Programar excepciones en Java

Estoy desarrollando una tarea que requiere la descarga de archivos de las URL dadas, uno de los requisitos es que pueda manejar fallas y excepciones de la red.

En mi implementación, tuve un DonwloadManager que asigna un hilo para cada URL, para que no se bloquee.

El problema es que no estoy seguro de cómo burlarme de fallas y excepciones a través del código, intenté usar Quartz como programador y un trabajo que solo arroja excepciones, pero hasta donde sé, el programador se ejecuta en un hilo diferente, por lo que esto no afectar el hilo de descarga en absoluto.

¿Hay alguna manera de burlarse de las excepciones dentro del hilo de descarga?

Aquí está mi código para obtener más información:

public class DownloadManager {

int allocatedMemory = 0;

void validateURLs(String[] urls) {
    if (urls.length == 0) {
        throw new IllegalArgumentException("URLs List is empty");
    }
}

public ArrayList<Status> downloadURLs(String[] urls, int memorySize) throws Exception {
    validateURLs(urls);
    ExecutorService executor = Executors.newWorkStealingPool();
    CompletionService<Status> completionService = new ExecutorCompletionService<Status>(executor);
    ArrayList<Status> downloadStatus = new ArrayList<Status>();
    allocatedMemory = memorySize / urls.length;
    for (String url : urls) {
       completionService.submit(new DownloadWorker(url, allocatedMemory));
    }
    for(int i=0;i<urls.length;i++){
       Future<Status> URLStatus =  completionService.take();
        System.out.println(URLStatus.get());
        downloadStatus.add(URLStatus.get());
    }
    executor.shutdown();
    return downloadStatus;
}

Y esta es la descarga de Worker:

class DownloadWorker implements Callable<Status> {

static final int SUCCESS = 1, FAILURE = 0;

private int bufferSize;

private String assignedURL;

public DownloadWorker(String assignedURL, int bufferSize) {
    this.bufferSize = bufferSize;
    this.assignedURL = assignedURL;
}

public Status call() throws Exception {
    URLConnection openConnection = new URL(assignedURL).openConnection();
    openConnection.addRequestProperty("User-Agent",
            "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/39.0");
    String outputFileName = assignedURL.substring(assignedURL.lastIndexOf("/") + 1);
    RandomAccessFile outputFile = new RandomAccessFile(outputFileName, "rw");
    ReadableByteChannel inputChannel = Channels.newChannel(openConnection.getInputStream());
    FileChannel outputChannel = outputFile.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
    while (inputChannel.read(buffer) > 0) {
        buffer.flip();
        for (int i = 0; i < buffer.limit(); i++) {
            outputChannel.write(buffer);
        }
        buffer.clear();
    }
    outputChannel.close();
    inputChannel.close();
    outputFile.close();
    return new Status(assignedURL, true);
}

}

¿Alguna sugerencia sobre cómo simular / probar la excepción mediante programación?

Actualización: estaba pensando que, en lugar de programar excepciones, sería más fácil burlarse del estado futuro resultante, de modo que devuelva una excepción.

Respuestas a la pregunta(2)

Su respuesta a la pregunta