package com.googlecode.totallylazy; import java.lang.reflect.InvocationTargetException; public class LazyException extends RuntimeException { static final long serialVersionUID = -6664897190745766939L; public static LazyException lazyException(final Throwable cause){ if(cause instanceof LazyException){ return (LazyException) cause; } if(cause instanceof RuntimeException){ throw (RuntimeException)cause; } return new LazyException(cause); } private LazyException(Throwable cause) { super(unwrapLazy(cause)); } private static Throwable unwrapLazy(Throwable cause) { if(cause instanceof InvocationTargetException){ return cause.getCause(); } return cause; } public <E extends Exception> E unwrap(Class<E> exception) throws E{ return unwrap(this, exception); } public static <E extends Exception> E unwrap(RuntimeException e, Class<E> exception) throws E{ final Throwable theCause = e.getCause(); if(exception.isInstance(theCause)){ return exception.cast(theCause); } throw e; } }