/*
* Copyright 2004 The Apache Software Foundation
*
* 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 javax.servlet.jsp;

/**
 * Exception to be used by a Tag Handler to indicate some unrecoverable
 * error.
 * This error is to be caught by the top level of the JSP page and will result
 * in an error page.
 */

public class JspTagException extends JspException {
    /**
     * Constructs a new JspTagException with the specified message.
     * The message can be written to the server log and/or displayed
     * for the user.
     * 
     * @param msg a <code>String</code> specifying the text of 
     *     the exception message
     */
    public JspTagException(String msg) {
	super( msg );
    }

    /**
     * Constructs a new JspTagException with no message.
     */
    public JspTagException() {
	super();
    }

    /**
     * Constructs a new JspTagException when the JSP Tag
     * needs to throw an exception and include a message 
     * about the "root cause" exception that interfered with its 
     * normal operation, including a description message.
     *
     *
     * @param message 		a <code>String</code> containing 
     *				the text of the exception message
     *
     * @param rootCause		the <code>Throwable</code> exception 
     *				that interfered with the JSP Tag's
     *				normal operation, making this JSP Tag
     *				exception necessary
     *
     * @since 2.0
     */
    public JspTagException(String message, Throwable rootCause) {
	super( message, rootCause );
    }


    /**
     * Constructs a new JSP Tag exception when the JSP Tag
     * needs to throw an exception and include a message
     * about the "root cause" exception that interfered with its
     * normal operation.  The exception's message is based on the localized
     * message of the underlying exception.
     *
     * <p>This method calls the <code>getLocalizedMessage</code> method
     * on the <code>Throwable</code> exception to get a localized exception
     * message. When subclassing <code>JspTagException</code>, 
     * this method can be overridden to create an exception message 
     * designed for a specific locale.
     *
     * @param rootCause 	the <code>Throwable</code> exception
     * 				that interfered with the JSP Tag's
     *				normal operation, making the JSP Tag 
     *                          exception necessary
     *
     * @since 2.0
     */

    public JspTagException(Throwable rootCause) {
	super( rootCause );
    }

}
