/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.rya.forwardchain;

/**
 * Broad exception representing an error during forward chaining. Useful for
 * wrapping the diverse kinds of exceptions that may be thrown by
 * implementations of reasoning logic.
 */
public class ForwardChainException extends Exception {
    private static final long serialVersionUID = 1L;

    /**
     * Constructs a new ForwardChainException with a message and a cause.
     * @param string Detail message
     * @param e Underlying cause
     */
    public ForwardChainException(String string, Exception e) {
        super(string , e);
    }

    /**
     * Constructs a new ForwardChainException with a message only.
     * @param string Detail message
     */
    public ForwardChainException(String string) {
        super(string);
    }

    /**
     * Constructs a new ForwardChainException with a root cause and no
     * additional message.
     * @param e Underlying cause
     */
    public ForwardChainException(Exception e) {
        super(e);
    }
}
