Да, это ужасная идея.
Вы сохраняете "name"
в переменную error
перед чтением свойства. Вы понятия не имеете, будет ли свойство читаться, но переменная была установлена независимо от чтения. Если каждое свойство было успешно проанализировано, на что мы и надеемся, переменная error по-прежнему будет иметь какое-либо имя свойства.
В таких сценариях мы обычно помещаем эту информацию в экземпляр исключения. Когда мы находимся в блокирующем блоке, мы можем получить доступ к этой информации и действовать соответственно.
public String getValue(String propertyName) {
try {
tryToReadProperty(propertyName);
} catch (Exception e) {
// something wrong happened
throw new IllegalArgumentException(propertyName);
}
}
...
try {
String name = getValue("name");
String surname = getValue("surname");
} catch (IllegalArgumentException e){
String error = e.getMessage();
}
Для простоты я использовал IllegalArgumentException
, его следует заменить на более значимый тип исключения, специфичный для предметной области.
return error;
Мы редко делаем это. Вместо этого мы распространяем исключение или перебрасываем другое исключение, определяемое уровнем.