<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>FactoryException.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Factory</a> &gt; <a href="index.source.html" class="el_package">org.apache.fulcrum.factory</a> &gt; <span class="el_source">FactoryException.java</span></div><h1>FactoryException.java</h1><pre class="source lang-java linenums">package org.apache.fulcrum.factory;

/*
 * 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
 * &quot;License&quot;); 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
 * &quot;AS IS&quot; 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.
 */

/**
 * Exception thrown when there is a problem with the FactoryService
 *
 * @author &lt;a href=&quot;mailto:epugh@upstate.com&quot;&gt;Eric Pugh&lt;/a&gt;
 * @version $Id$
 */
public class FactoryException extends Exception {
	/**
	 * Serial number
	 */
	private static final long serialVersionUID = 8954422192583295720L;

	/**
	 * Default constructor
	 */
	public FactoryException() 
	{
<span class="nc" id="L39">		super();</span>
<span class="nc" id="L40">	}</span>

	/**
	 * {@link java.lang.Exception#Exception(String, Throwable)}
	 * 
	 * @param message the message
	 * @param e       the exception
	 */
	public FactoryException(String message, Throwable e) 
	{
<span class="nc" id="L50">		super(message, e);</span>
<span class="nc" id="L51">	}</span>

	/**
	 * {@link java.lang.Exception#Exception(Throwable)}
	 * 
	 * @param e the exception to bubble up
	 */
	public FactoryException(Throwable e) 
	{
<span class="nc" id="L60">		super(e);</span>
<span class="nc" id="L61">	}</span>

	/**
	 * {@link java.lang.Exception#Exception(String)}
	 * 
	 * @param msg the message to bubble up
	 */
	public FactoryException(String msg) 
	{
<span class="nc" id="L70">		super(msg);</span>
<span class="nc" id="L71">	}</span>
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>