Я работаю над проектом, который содержит пару модулей. Я хочу предоставить возможность в каждом модуле иметь пользовательское исключение, которое статически заполняет внутреннюю структуру, например HashMap, из файла свойств с пользовательскими парами error_code-error_message.
У меня есть базовое абстрактное пользовательское исключение, которое содержит статическое свойство:
public abstract class AbstractException extends RuntimeException{
public static Map<String, String> ERRORS = new HashMap<String, String>();
public String code;
// getters and setter for code ommited
public static init(String fileName, Class<?> clazz){
// read properties file
// populate map
}
public static String getMessageByCode(String code){
//
String mess = ERRORS.get(code);
// in case of null message provide default message about unknown error
}
public AbstractException(String code){
super(getMessageByCode(code));
this.setCode(code);
}
public AbstractException(Throwable thr){
super(getMessageByCode("ERROR_999"), thr);
this.setCode(code);
}
public AbstractException(Throwable thr, String msg){
super(getMessageByCode("ERROR_999") + " " + msg, thr);
this.setCode(code);
}
}
Простое пользовательское исключение
public class MyException extends AbstractException{
static{
// populate internal map with module-specific errors
init("module1.errors.properties", MyException.class);
}
public MyException(String code){
super(getMessageByCode());
}
// rest code omited
}
Простое использование пользовательского исключения в коде:
throw new MyException("ERROR_404");
Позволяет увидеть то, что я вижу в этом коде:
- Карта ОШИБКИ существует для всех дочерних классов абстрактного исключения
- Параллельный доступ к статическому полю ERRORS.
Вопрос в том, как избежать этих проблем, может быть, у кого-то есть лучшее решение моей проблемы?