public class DiskService{ private Writer diskWriter = ...; private final ErrorHandler ioErrorHandler = new ErrorHandler(); ... public void writeToDisk(byte[] data){ try{ diskWriter.write(data); } catch(IOException error){ ioErrorHandler.toss(error); } } public ErrorHandler onIOError(){ return ioErrorHandler; } } public class ErrorHandler{ private List errorMethodObjects = new List(); public void toss(Throwable error){ Iterator eachMethod = errorMethodObjects.iterator(); while(eachMethod.hasNext()){ ((MethodObject) eachMethod.next()).invoke(error); //or however you decide to call it } } public void doThis(MethodObject errorHandlingMethodObject){ errorMethodObjects.add(errorHandlingMethodObject); } } public class ErrorHandledMethod? extends MethodObject{ public final Object invoke(Object parameter){ try{ task(parameter); } catch(AbortTaskMessage? abort){ throw abort; } catch(RetryTaskMessage? retry){ invoke(retry.getParameter()); } catch(IgnoreFailureMessage? ignore){ return ignore.getResult(); } } public abstract void task(Object parameter); } public class Client extends ErrorHandledMethod?{ DiskService service = new DiskService(); { service.onIOError().doThis(new MethodObject(){ public void invoke(Object ioError){ throw new AbortTaskMessage?(); } }); } ... public void task(Object parameter){ service.write((byte[]) parameter); } ... }Discuss :)