01: /**
02: * InstantJ
03: *
04: * Copyright (C) 2002 Nils Meier
05: *
06: * This library is free software; you can redistribute it and/or
07: * modify it under the terms of the GNU Lesser General Public
08: * License as published by the Free Software Foundation; either
09: * version 2.1 of the License, or (at your option) any later version.
10: *
11: * This library is distributed in the hope that it will be useful,
12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * Lesser General Public License for more details.
15: *
16: */package instantj.expression;
17:
18: import instantj.reflect.ReflectAccess;
19:
20: /**
21: * This exception wraps the failed attempt to evaluate an expression
22: * because of a problem while running the compiled code
23: *
24: * @author <A href="mailto:nils@meiers.net">Nils Meier</A>
25: */
26: public class EvaluationFailedException extends Exception {
27:
28: /** the reason - what happened inside the expression */
29: private Throwable reason;
30:
31: /**
32: * Constructor
33: * @param msg the message
34: * @param reason the exception that occured
35: */
36: public EvaluationFailedException(Throwable reason) {
37: super (calcMessage(reason));
38: this .reason = reason;
39: }
40:
41: /**
42: * Getter for the reason why the expression couldn't be evaluated successfully
43: */
44: public Throwable getReason() {
45: return reason;
46: }
47:
48: /**
49: * Computes the error message
50: */
51: private static String calcMessage(Throwable reason) {
52:
53: // The beginning is easy
54: String message = "a " + reason.getClass().getName()
55: + " occured";
56:
57: // .. but then we also try to analyze the stacktrace
58: // (this is only supported in JDK1.4 so we make it introspective)
59: try {
60: // StackTraceElement[] elements = reason.getStackTrace();
61: Object[] elements = (Object[]) ReflectAccess.getInstance()
62: .invokeGetter(reason, "stackTrace");
63: String line;
64: if ((elements != null) && (elements.length > 0)) {
65: // line = ""+elements[0].getLineNumber()
66: line = ""
67: + ReflectAccess.getInstance().invokeGetter(
68: elements[0], "lineNumber");
69: // the message
70: message += " in line " + line;
71: }
72: } catch (Throwable t) {
73: }
74:
75: // Done
76: return message;
77: }
78:
79: }
|