/*
 * Copyright 2010 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.requestfactory.server;

import com.google.gwt.requestfactory.shared.ServerFailure;

/**
 * Handles an exception produced while processing a request.
 *
 * <p><span style='color:red'>RequestFactory has moved to
 * <code>com.google.web.bindery.requestfactory</code>.  This package will be
 * removed in a future version of GWT.</span></p>
 *
 * @see DefaultExceptionHandler
 */
@Deprecated
public interface ExceptionHandler {
  /**
   * Generates a {@link ServerFailure} based on the information contained in the
   * received {@code exception}.
   *
   * @param throwable a Throwable instance
   * @return a {@link ServerFailure} instance
   * @see DefaultExceptionHandler
   */
  ServerFailure createServerFailure(Throwable throwable);
}
