Подтвердить что ты не робот

Java - Как сделать Python Try Except Else

Как сделать попытку, кроме else в Java, как в Python?

Пример:

try:
   something()
except SomethingException,err:
   print 'error'
else:
   print 'succeeded'

Я вижу попытку и уловку, но ничего больше.

4b9b3361

Ответ 1

Я не совсем уверен, что мне это нравится, но это было бы эквивалентно Python else. Это устраняет проблему, связанную с помещением кода успеха в конце блока try.

bool success = true;
try {
    something();
} catch (Exception e) {
    success = false;
    // other exception handling
}
if (success) {
    // equivalent of Python else goes here
}

Ответ 2

Как насчет этого?

try {
    something();
} catch (Exception e) {
    // exception handling
    return;
}
// equivalent of Python else goes here

Конечно, есть некоторые случаи, когда вы хотите поместить больше кода после try/catch/else, и это решение не подходит там, но оно работает, если это единственный блок try/catch в вашем методе.

Ответ 3

Пока нет встроенного способа сделать это точно. Вы можете сделать что-то подобное, чтобы достичь аналогичных результатов. Комментарии объясняют, почему это не то же самое.

Если выполнение somethingThatCouldError() пройдет, будет напечатано YAY!!. Если произошла ошибка, будет напечатан SAD.

try {
    somethingThatCouldError();
    System.out.println("YAY!!");
    // More general, code that needs to be executed in the case of success
} catch (Exception e) {
    System.out.println("SAD");
    // code for the failure case
}

Этот путь немного менее явный, чем Python. Но он достигает такого же эффекта.

Ответ 4

Хотя Райан об отслеживании ошибок с логическими значениями (аргументами) хорош, я думаю, что в этом случае лучше использовать "логический блок" для "перехода вперед".

В Java вам разрешено создавать произвольные блоки контекста (области) с помощью <optional-label-name followed by ':'>{...} и назначать им метки. Вы можете позвонить break <labelname>;

Вот пример того, с чем я могу играть:

private static void trycatchelsetest(boolean err) {
    myLogicBlock: {
        try {
            System.out.println("TRY");
            { //unlabeled block for demonstration
            if(err)
                throw new IOException("HELLO!");
            }
        } catch(IOException e) {
            System.out.println("CATCH");
            break myLogicBlock;
        } finally {
            System.out.println("FINALLY");
        }

        System.out.println("ELSE");
    }

    System.out.println("END");
}

Причина, по которой у Try нет другого кода, заключается в том, что он предназначен для отлова определенной ошибки из определенного блока кода, который либо обрабатывается (обычно путем установки значения по умолчанию или возвращается), либо всплывает (и finally предлагается только для того, чтобы убедиться, что ресурсы не просочились из-за прерывания, даже если вы вышли из строя). В приведенном выше примере прерывания мы обрабатываем исключение, пропуская блок кода, который больше не актуален из-за ошибки (переход к следующему логическому шагу). Логический пример Райана обрабатывает это, отмечая, что произошла ошибка, и позволяя последним частям кода реагировать на то, что происходит после факта.

Я думаю, что логический блок лучше, чем логический подход (если у вас нет сложной логики, основанной на том, какие ошибки были выданы), потому что он не требует, чтобы читатель знал всю функцию, чтобы понять, что происходит. Они видят break <labelname>; и знают, что программа будет эффективно переходить к концу этого блока. Логическое значение требует, чтобы программист отслеживал все, что принимает решения на его основе.

Очевидно, что "Skip-forward" и булево отслеживание имеют свои преимущества и, как правило, будут более предпочтительным стилем.