Ответ 1
Try:
throw new Exception("transction: " + transNbr, E);
У меня есть небольшая часть кода, которая проходит через некоторые транзакции для обработки. Каждая транзакция отмечена номером транзакции, который генерируется внешней программой и не обязательно секвенирован. Когда я поймаю Исключение в коде обработки, я бросаю его в основной класс и записываю его для дальнейшего рассмотрения. Я хотел бы добавить номер транзакции в это исключенное исключение. Возможно ли это сделать, сохраняя при этом правильную трассировку стека?
Пример:
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;
}
}
}
Try:
throw new Exception("transction: " + transNbr, E);
Исключения обычно неизменяемы: вы не можете изменить свое сообщение после того, как они были созданы. Тем не менее, вы можете сделать это за исключением:
throw new TransactionProblemException(transNbr, originalException);
Трассировка стека будет выглядеть как
TransactionProblemException : transNbr
at ...
at ...
caused by OriginalException ...
at ...
at ...
Существует конструктор Exception
, который также принимает аргумент причины: Исключение (сообщение String, Throwable t)
Вы можете использовать его для распространения stacktrace:
try{
...
}catch(Exception E){
if(!transNbr.equals("")){
throw new Exception("transction: " + transNbr, E);
}
...
}
вы можете использовать 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);
}
}
}
Вы можете использовать свое сообщение об исключении: -
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;
}
}