001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.juneau.commons.reflect;
018
019import static org.apache.juneau.commons.utils.Shorts.*;
020
021import java.lang.reflect.*;
022
023/**
024 * General exception that occurs when trying to execute a constructor, method, or field using reflection.
025 *
026 *
027 * @serial exclude
028 */
029public class ExecutableException extends RuntimeException {
030
031   private static final long serialVersionUID = 1L;
032
033   /**
034    * Constructor.
035    *
036    * @param message The {@link String#format(String, Object...) String.format}-style message (<c>%s</c> placeholders).
037    * @param args Optional {@link String#format(String, Object...) String.format}-style arguments.
038    */
039   public ExecutableException(String message, Object...args) {
040      super(f(message, args));
041   }
042
043   /**
044    * Constructor.
045    *
046    * @param causedBy The cause of this exception.
047    */
048   public ExecutableException(Throwable causedBy) {
049      super(causedBy);
050   }
051
052   /**
053    * Constructor.
054    *
055    * @param causedBy The cause of this exception.
056    * @param message The {@link String#format(String, Object...) String.format}-style message (<c>%s</c> placeholders).
057    * @param args Optional {@link String#format(String, Object...) String.format}-style arguments.
058    */
059   public ExecutableException(Throwable causedBy, String message, Object...args) {
060      super(f(message, args), causedBy);
061   }
062
063   /**
064    * If the thrown exception was an {@link InvocationTargetException} returns the target exception.
065    * Otherwise returns the inner exception which is typically {@link IllegalArgumentException} or {@link IllegalAccessException}.
066    *
067    * @return The inner throwable.
068    */
069   public Throwable getTargetException() {
070      Throwable c = this.getCause();
071      return c instanceof InvocationTargetException c2 ? c2.getTargetException() : c;
072   }
073
074   /**
075    * Returns the caused-by exception if there is one.
076    *
077    * @return The caused-by exception if there is one, or this exception if there isn't.
078    */
079   public Throwable unwrap() {
080      Throwable t = getCause();
081      return t == null ? this : t;
082   }
083}