1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package org.apache.commons.httpclient.util;
30
31 import java.lang.reflect.Method;
32
33 import org.apache.commons.logging.Log;
34 import org.apache.commons.logging.LogFactory;
35
36 /***
37 * The home for utility methods that handle various exception-related tasks.
38 *
39 * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
40 * @author <a href="mailto:laura@lwerner.org">Laura Werner</a>
41 *
42 * @since 3.0
43 */
44 public class ExceptionUtil {
45
46 /*** Log object for this class. */
47 private static final Log LOG = LogFactory.getLog(ExceptionUtil.class);
48
49 /*** A reference to Throwable's initCause method, or null if it's not there in this JVM */
50 static private final Method initCause = getInitCauseMethod();
51
52 /***
53 * Returns a <code>Method<code> allowing access to
54 * {@link Throwable.initCause(Throwable) initCause} method of {@link Throwable},
55 * or <code>null</code> if the method
56 * does not exist.
57 *
58 * @return A <code>Method<code> for <code>Throwable.initCause</code>, or
59 * <code>null</code> if unavailable.
60 */
61 static private Method getInitCauseMethod() {
62 try {
63 Class[] paramsClasses = new Class[] { Throwable.class };
64 return Throwable.class.getMethod("initCause", paramsClasses);
65 } catch (NoSuchMethodException e) {
66 return null;
67 }
68 }
69
70 /***
71 * If we're running on JDK 1.4 or later, initialize the cause for the given throwable.
72 *
73 * @param throwable The throwable.
74 * @param cause The cause of the throwable.
75 */
76 public static void initCause(Throwable throwable, Throwable cause) {
77 if (initCause != null) {
78 try {
79 initCause.invoke(throwable, new Object[] { cause });
80 } catch (Exception e) {
81 LOG.warn("Exception invoking Throwable.initCause", e);
82 }
83 }
84 }
85 }