/*
 * Copyright 2006 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.core.ext;

/**
 * Used to indicate that some part of a multi-step process failed. Typically,
 * operation can continue after this exception is caught.
 * 
 * Before throwing an object of this type, the thrower
 * <ul>
 * <li>must log a detailed user-facing message describing the failure,</li>
 * <li>must report any caught exception using the logger that contributed to
 * the failure, and </li>
 * <li>must not include the cause of the failure in the thrown exception
 * because (1) it will already have been associated with the detailed log entry
 * above and (2) doing so would create a misunderstanding of how to find the
 * causes of low-level errors in that sometimes there is an underlying an
 * exception, sometimes not, but there can <em>always</em> be a preceding log
 * entry. </li>
 * </ul>
 * 
 * After catching an object of this type, the catcher
 * <ul>
 * <li>can be assured that the thrower has already logged a message about the
 * lower-level problem</li>
 * <li>can optionally itself log a higher-level description of the process that
 * was interrupted and the implications of the failure, and if so,</li>
 * <li>should report this caught exception via the logger as well.</li>
 * </ul>
 * 
 * <pre>
 *  void lowLevel(Logger logger) throws UnableToCompleteException {
 *      try {
 *          doSomethingThatMightFail();
 *      catch (SomeException e) {
 *          // Log low-level detail and the caught exception.
 *          //
 *          logger.log("detailed problem explanation for user eyes...", e);
 *          
 *          // Do not include the caught exception.
 *          //
 *          throw new UnableToCompleteException();
 *      }
 *  }
 *  
 *  void highLevel(Logger logger) {
 *      try {
 *          // Multiple calls are shown to indicate that the process can 
 *          // include any number of steps.
 *          //
 *          lowLevel(logger);
 *          lowLevel(logger);
 *          lowLevel(logger);
 *      }
 *      catch (UnableToCompleteException e) {
 *          logger.log("high-level thing failed", e);
 *      }    
 *  }
 * </pre>
 * 
 */
public class UnableToCompleteException extends Exception {
  public UnableToCompleteException() {
    super("(see previous log entries)");
  }
}
