1

我正在为大学准备一个项目,我需要编写一个自定义异常,当它们未正确初始化时,同一包中的几个类将抛出该异常。问题是我必须让用户知道哪些类没有正确初始化(并抛出异常)......所以我在考虑这样的事情:

class InitializationException extends Exception {

private static final String DEFAULT_MSG =
            "This " + CLASSNAME-THROWINGME + " had not been initialized properly!";

    protected String msg;

InitializationException() {
    this.msg = DEFAULT_MSG;
}

    InitializationException(String msg) {
    this.msg = msg;
}
}

(顺便说一句,它可以通过反射来实现吗?)

4

6 回答 6

6

Throwable.getStackTrace()。每个StackTraceElement都有getClassName()。您可以查看元素[0]以确定异常的起源。

于 2013-05-02T17:04:47.457 回答
1

就像是:

StackTraceElement[] trace = theException.getStackTrace();
String className = trace[0].getClassName();

(虽然我不太确定你想要跟踪中的第一个元素还是最后一个元素。)

(请注意,您可以创建一个 Throwable 并在其上执行 getStackTrace(),而无需抛出它,以找出谁给您打电话(这将是跟踪元素 1)。)

于 2013-05-02T17:06:42.943 回答
1

我只是将 throwing 类传递给构造函数,如下所示:

public class InitializationException extends Exception {

    public InitializationException(Class<?> throwingClass) { ... }

    ...
}
于 2013-05-02T17:08:41.417 回答
1
class InitializationException extends Exception {
    private final String classname;
    InitializationException(String msg, Object origin) {
        super(msg);
        this.classname = origin != null ? origin.getClass().toString() : null;
    }
    public String getClassname() {
        return this.classname;
    }
}

. . . . throw new InitializationException("出了点问题", this);

于 2013-05-02T17:14:27.663 回答
0

它的解决方法:

您可以在构造函数中传递类名,例如

throw new  InitializationException(getClass().getName());

或者可以调用类

throw new InitializationException(this);

并在您的 excpetin 类中处理名称提取

 InitializationExcpetion(Object context){ 
this.name = getClass().getName() 
}
于 2013-05-02T17:07:39.250 回答
0

答案是你强制抛出异常的类告诉异常它是哪个类:

public class InitializationException extends Exception {

    public InitializationException(Class<?> c) {
        super( "The class " + c.getName()+ " had not been initialized properly!");
    }
}
于 2013-05-02T17:15:42.577 回答