В моем консольном приложении я хочу печатать сообщения об ошибках с полной глубиной графика только в случае ошибки.
Я проверяю графоподобные (Json) данные путем рекурсивной итерации по всем узлам. Если сообщение об ошибке должно быть напечатано для одного конечного узла, я хочу (лениво) вывести имена всех родительских узлов один раз перед этим первым листовым сообщением об ошибке.
Редактировать: Давайте предположим, что я перебираю файловую структуру, подобную этой
A - B - C - D
| - X - Z
Я хочу печатать на выход консоли только в случае ошибки.
Для первого примера в примере ошибка может быть в C. Таким образом, при проверке A и B вывод не производится. При проверке C обнаруживается ошибка, и все сообщения информационного уровня (например, имя узлов A и B) должны быть напечатаны до сообщения об ошибке:
- Проверка A: без ошибок, вывод: -
- Проверка B: нет ошибок, Вывод: -
- Проверка C: ошибка, вывод: «Проверка A», «Проверка B», «Проверка C», «Ошибка в C»
Выводятся только выходные данные текущего пути дерева. Для второго примера ошибка может возникнуть в Z:
1. Проверка A: без ошибок, вывод: -
2. Проверка B: без ошибок, вывод: -
3. Проверка C: без ошибок, вывод: -
4. Проверка D: без ошибок, вывод: -
5. Проверка X: без ошибок, вывод: -
6. Проверка Z: ошибка, вывод: «Проверка A», «Проверка B», «Проверка X», «Проверка Z», «Ошибка в Z»
Edit:
Это мое текущее решение.
public class Log {
private static final int indentStep = 4;
static public int indent = 1;
static private ArrayList<String> messages = new ArrayList<String>();
static public void incIndent() {
indent += indentStep;
}
static public void decIndent() {
indent = indent > indentStep ? indent - indentStep : 1;
}
public static void log(final Object msg) {
System.out.println(String.format("%" + indent + "c", ' ') + msg);
}
public static void logError(final Object msg) {
System.err.println(String.format("%" + indent + "c", ' ') + msg);
}
public static int push(String s) {
messages.add(String.format("%" + indent + "c", ' ') + s);
return messages.size() - 1;
}
public static void error(String e) {
for (String s : messages) {
System.out.println(s);
}
messages.clear();
System.err.println(String.format("%" + indent + "c", ' ') + e);
}
public static void pop(int i) {
while (messages.size() > i) {
messages.remove(i);
}
}
}
Теперь метод, использующий его, выглядит следующим образом:
void validateChecksumFile(){
int logLevel = Log.push("Title");
if(errorCondition){
Log.error("Errormessage");
}
Log.pop(logLevel);
}
Где «Заголовок» печатается, только если после него напечатано «Сообщение об ошибке».
Это соответствует моим функциональным требованиям, но я думаю, что должно быть более простое решение.