Что на первом месте - наконец или блок выгоды?

Внимание, Object.assign(this.$data, this.$options.data()) не связывает контекст с данными ().

Итак, если вы используете это в своем методе данных, вы можете применить контекст с

blockquote>
Object.assign(this.$data, this.$options.data.apply(this))

cc, этот ответ был изначально здесь

23
задан Daniel Martin 24 June 2010 в 11:26
поделиться

8 ответов

Поскольку блок try в test2 () не имеет ловушки ], только , наконец, . Код не будет «перепрыгивать» к вызывающему, чтобы попасть в catch , а затем «прыгать вперед» к finally , чтобы продолжить там, как вы, кажется, думаете.

16
ответ дан 29 November 2019 в 01:40
поделиться

Вот ключевые моменты:

  • В блоке try-(catch)-finally finally для этого конкретного блока try выполняется последним
  • Вы можете Гнездо try блоков внутри другого, и каждый из этих вложенных try блоков может иметь свои собственные finally, которые будут выполняться последними для этих отдельных try блоков

Так да, finally выполняется последним, но только для блока try, к которому он присоединен.

Итак, учитывая следующий фрагмент:

try {
    try {
        throw null;
    } finally {
        System.out.println("Finally (inner)");
    }
} catch (Throwable e) {
    System.out.println("Catch (outer)");
}

Это печатает (, как видно на ideone.com ):

Finally (inner)
Catch (outer)

Заметьте, что:

  • В (inner), Finally является последним (независимо от того, был ли успешным какой-либо catch)
  • Catch (outer) следует Finally (inner), но это потому, что Finally (inner) вложено внутрь еще один try блок в (outer)

Аналогично, следующий фрагмент:

    try {
        try {
            throw null;
        } catch (Throwable e) {
            System.out.println("Catch (inner)");
        } finally {
            System.out.println("Finally (inner)");
            throw null;
        }
    } catch (Throwable e) {
        System.out.println("Catch (outer)");
    }

Это печатает (, как видно на Ideone. com ):

Catch (inner)
Finally (inner)
Catch (outer)

Ссылки

Похожие вопросы

17
ответ дан Community 29 November 2019 в 01:40
поделиться

Поскольку блок finally всегда выполняется непосредственно перед выходом из области видимости. Последовательность событий после вызова test2() выглядит следующим образом:

  1. исключение выдается в test2()
  2. Поскольку test2 не имеет блока catch, исключение распространяется до звонящего.
  3. Так как test2 имеет блок finally, он выполняется перед возвратом из метода.
  4. catch в основном методе ловит исключение.
4
ответ дан Péter Török 29 November 2019 в 01:40
поделиться

Потому что finally - самый последний код, выполняемый в блоке try..catch, независимо от того, было ли исключение выброшено, сгенерировано и затем обработано, или не сгенерировано вообще.

Фактически, единственный раз, когда не будет вызван , будет, если JVM завершит работу до того, как его выполнит, или если поток, выполняющий код попытки, будет уничтожен или прерван.

В ответ на комментарии: Java-описание finally

Note: If the JVM exits while the try or catch code is being executed,

тогда блок finally может не выполняться. Аналогичным образом, если поток, выполняющий код try или catch, прерывается или уничтожается, блок finally может не выполняться, даже если приложение в целом продолжается.

Однако вы правы в том, что выдается исключение ThreadDeath, и я не могу найти много подробностей о том, что кажется противоречивой информацией от Sun. Это может быть вопрос сам по себе.

finally (простите за каламбур) @brainimus, если вы находитесь в finally и вы бросаете исключение, тогда выполняется код finally , моя точка зрения заключалась в следующих условиях: который окончательный код не выполняется.

2
ответ дан Adrian Regan 29 November 2019 в 01:40
поделиться

Пробный блок выполняется первым. Catch выполняется, если в блоке try есть исключение, которое необходимо перехватить. Наконец, блок выполняется в обоих случаях независимо от того, есть ли исключение или нет. Если в блоке try есть оператор return, то перед возвратом в блок try выполняется блок finally, а затем выполняется блок return в блоке try.

0
ответ дан Imdad Soomro 29 November 2019 в 01:40
поделиться

catch идет перед finally в той же области видимости try-catch-finally.

В test2 в области видимости try-catch-finally test2 нет catch, поэтому он выполняет finally, прежде чем покинуть область видимости и попасть в вышестоящую catch.

7
ответ дан 29 November 2019 в 01:40
поделиться

try - catch и finally используются для предотвращения ситуаций, когда программа может завершиться из-за возникновения нежелательной ошибки во время ее выполнения.

Следующие пункты важны....

1)Существует только одна попытка для блока...... любое количество операторов catch для блока и только один finally для блока утверждений

2)finally является необязательным.

3) catch также необязателен, но если оператор catch отсутствует, то finally должен появиться.

4) Все catch, соответствующие дочерним исключениям, должны появляться перед catch для родительского исключения.

5) Независимо от возникновения исключения утверждения, присутствующие в блоке finally, выполняются всегда с одним исключением.

т.е. если встречается оператор System.out.exit(), то программа немедленно завершается, поэтому finally не может быть выполнен в таких случаях.

Примечание: даже если в блоке try встречается оператор return ... тогда также выполняется код в finally.

2
ответ дан 29 November 2019 в 01:40
поделиться

Если вы замените функции кодом методов, вы получите:

public class Main {

    static int a = 0;

    public static void main(String[] args) {
        try {
            try {
                throw new Exception();
            }
            catch (Exception e) {
                // I catch only the *first* exception thrown   
                System.out.println(a + ": inner catch");
                a++;
                // let's go to the finally block
            }
            finally {
                System.out.println(a + ": finally");
                a++;
                // we go on
            }
            System.out.println("---");
            try {
                throw new Exception();
            }
            finally {
                // executed because at the same level
                System.out.println(a + ": finally");
                a++;
            }
        }
        catch(Exception e) {
            // I catch only the *second* exception thrown
            System.out.println(a + ": outer catch");
            a++;
        }
    }

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

0
ответ дан 29 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: