Java: записать информацию StackTrace в сообщение об исключении - PullRequest
0 голосов
/ 12 марта 2012

Я хочу расширить класс Exception с помощью OtherException и написать имя класса и метода броска в поле сообщения.Я не вижу другого способа, кроме использования родительского конструктора для установки сообщения, но я не могу использовать методы, такие как getStackTrace, в аргументе super.Есть обходные пути?Или кто-нибудь знает, почему это нельзя сделать?

Это функциональность, которую я хотел бы иметь:

public OtherException(final String message) {
    super(message + getStackTrace()[0].getClassName()+" "+getStackTrace()[0].getMethodName());
}

, но она не работает в Java.Это работает:

public OtherException(final String message) {
    super(message + " class: " + Thread.currentThread().getStackTrace()[2].getClassName() + ", method: "
            + Thread.currentThread().getStackTrace()[2].getMethodName());
}

Может, кто-нибудь знает что-нибудь более изящное?

Ответы [ 2 ]

0 голосов
/ 12 марта 2012

Обычно вы используете трассировку стека в Исключении для трассировки стека.

public class OtherException extends Exception {
    public OtherException(final String message) {
        super(message);
    }
}

OtherException oe = new OtherException("Hello");
StackTraceElement[] stes = oe.getStackTrace(); // get stack trace.

информация о стеке записывается в момент создания исключения. Фактический StackTraceElement [] создается при первом использовании.

0 голосов
/ 12 марта 2012

Насколько я понимаю, вы хотите иметь имя метода, в котором было выдано исключение, в качестве сообщения об исключении, не так ли? В этом случае ваша реализация в порядке, просто я бы поместил ее в конструктор по умолчанию вашего исключения:

public OtherException() {
    super(getStackTrace()[0].getClassName()+" "+getStackTrace()[0].getMethodName());
}

Действительно, вы не используете аргумент message в своем конструкторе, поэтому он бесполезен. И если вы переопределите конструктор по умолчанию, вы все равно сможете реализовать другие конструкторы, которые примут сообщение и передадут его super, обычно это делают люди при создании пользовательских исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...