Как настроить операцию по умолчанию всякий раз, когда выполняется блок catch? - PullRequest
3 голосов
/ 16 апреля 2019

В целях отладки я хочу, чтобы мое приложение Java загружало файл журнала в мою базу данных MySql всякий раз, когда выполняется условие catch, независимо от того, какое исключение выдается.

Худшее решение, о котором я думал, это добавить мой метод загрузки в каждый catch в моем коде (как я уже делал для создания моего файла журнала). Это явно не элегантный метод, поскольку это повторяющийся код. Итак, мой вопрос: существует ли он каким-то образом (может быть, в свойствах проекта) для установки операции по умолчанию, которая будет выполняться при выполнении условия catch?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Нет способа создать поведение по умолчанию, не вводя его в него ... Создайте глобальный метод, чтобы вы могли вызывать его одной строкой.

2 голосов
/ 16 апреля 2019

Одним из вариантов будет использование каркаса ведения журнала (независимо от того, пишете ли вы это самостоятельно или используете существующее решение), поэтому вы можете сделать:

try{}
catch(Exception e) {Logger.logExceptionToDatabase(e); }

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

К самому вопросу: это невозможно, однако есть блок finally, который выполняется после соответствующего блока try (до тех пор, пока JVM не завершается в блоке try). Может быть, вы могли бы ввести TransactionResult и сделать запись для каждого успеха и неудачи, а затем сделать:

TransactionResult transactionResult;

try{
//do work and at the last line in the try after each operation that could 
have failed has been executed set your transactionResult variable
transactionResult = new SuccessTransaction();
}
catch(Excpetion e) { transactionResult=  new FailureTransaction();}
finally {Logger.logTransaction(transactionResult); }

и соответствующие классы:

public interface TransactionResult{
  public void writeLog();

} 

и пример результата транзакции:

public class SuccessTransaction implements TransactionResult{
private String resultStatus;

public SuccessTransaction() { this.resultStatus = "success"; }

public void writeLog() { System.out.println(this.resultStatus); } //or whatever you want to do with your result

}

То же самое относится к вашему экземпляру сбоя.

Обновление

Поскольку вы заявили, что существует множество исключений, вы также можете передать свое исключение в конкретный FailureTransaction, а затем просто записать это сообщение или собрать все ошибки в списке, а затем проследить, какие исключения были вызваны.

1 голос
/ 16 апреля 2019

Вы можете сделать что-то вроде следующего:

public static void myMethod() throws FooException, BarException   {
    throw new FooException();
}

// if you don't care about specific catch cases:
public static void main(String[] args) throws FooException, BarException   {
    try {
        myMethod();
    } catch (Exception x) {
        x.printStackTrace(); // default behavior on exception
        throw x; // let the specific exception bubble up the call stack 
        // The compiler knows that this will be either FooException or BarException
    }
}

// if you need to also handle specific catch cases:
public static void main(String[] args) throws BarException {
    try { // outer try-catch, to handle specific exceptions
        try { // inner try-catch to handle default catch behavior
            myMethod();
        } catch (Exception x) { // Or } catch (FooException | BarException   x) {
            x.printStackTrace(); // default behavior on exception
            throw x; // let the exception bubble up to the specific catch clauses.
            // The compiler knows that this will be either FooException or BarException
        }
    } catch (FooException e) {
        System.err.println("Doing something specific to 'FooException'");
        // could re-throw if you want to
    } catch (BarException  e) {
        System.err.println("Doing something specific to 'BarException'");
        throw e; // only re-throw if you want to
    }
}

Если вам не нужно ничего делать для определенных исключений, тогда первый main должен работать просто отлично.

Если вы хотите обработать определенные исключения поверх вашего поведения перехвата по умолчанию , то просто перебросьте исключение, поймайте, что это такое, и обработайте этот конкретный случай.

Вы всегда можете перебросить исключение, если хотите, чтобы оно всплыло в стеке вызовов.

...