Подтвердить что ты не робот

Добавление настраиваемого сообщения для исключения исключений при сохранении трассировки стека в Java

У меня есть небольшая часть кода, которая проходит через некоторые транзакции для обработки. Каждая транзакция отмечена номером транзакции, который генерируется внешней программой и не обязательно секвенирован. Когда я поймаю Исключение в коде обработки, я бросаю его в основной класс и записываю его для дальнейшего рассмотрения. Я хотел бы добавить номер транзакции в это исключенное исключение. Возможно ли это сделать, сохраняя при этом правильную трассировку стека?

Пример:

public static void main(String[] args) {
    try{
        processMessage();
    }catch(Exception E){
        E.printStackTrace();
    }

}

private static void processMessage() throws Exception{
    String transNbr = "";
    try{
        transNbr = "2345";
        throw new Exception();
    }catch(Exception E){
        if(!transNbr.equals("")){
            //stack trace originates from here, not from actual exception
            throw new Exception("transction: " + transNbr); 
        }else{
            //stack trace gets passed correctly but no custom message available
            throw E;
        }
    }
}
4b9b3361

Ответ 1

Try:

throw new Exception("transction: " + transNbr, E); 

Ответ 2

Исключения обычно неизменяемы: вы не можете изменить свое сообщение после того, как они были созданы. Тем не менее, вы можете сделать это за исключением:

throw new TransactionProblemException(transNbr, originalException);

Трассировка стека будет выглядеть как

TransactionProblemException : transNbr
at ...
at ...
caused by OriginalException ...
at ...
at ...

Ответ 3

Существует конструктор Exception, который также принимает аргумент причины: Исключение (сообщение String, Throwable t)

Вы можете использовать его для распространения stacktrace:

try{
    ...
}catch(Exception E){
    if(!transNbr.equals("")){
        throw new Exception("transction: " + transNbr, E); 
    }
    ...
}

Ответ 4

вы можете использовать super при расширении Exception

if (pass.length() < minPassLength)
    throw new InvalidPassException("The password provided is too short");
 } catch (NullPointerException e) {
    throw new InvalidPassException("No password provided", e);
 }


// A custom business exception
class InvalidPassException extends Exception {

InvalidPassException() {

}

InvalidPassException(String message) {
    super(message);
}
InvalidPassException(String message, Throwable cause) {
   super(message, cause);
}

}

}

источник

Ответ 5

Вы можете использовать свое сообщение об исключении: -

 public class MyNullPointException extends NullPointerException {

        private ExceptionCodes exceptionCodesCode;

        public MyNullPointException(ExceptionCodes code) {
            this.exceptionCodesCode=code;
        }
        @Override
        public String getMessage() {
            return exceptionCodesCode.getCode();
        }


   public class enum ExceptionCodes {
    COULD_NOT_SAVE_RECORD ("cityId:001(could.not.save.record)"),
    NULL_POINT_EXCEPTION_RECORD ("cityId:002(null.point.exception.record)"),
    COULD_NOT_DELETE_RECORD ("cityId:003(could.not.delete.record)");

    private String code;

    private ExceptionCodes(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}