Внимание,
Object.assign(this.$data, this.$options.data())
не связывает контекст с данными ().Итак, если вы используете это в своем методе данных, вы можете применить контекст с
blockquote>Object.assign(this.$data, this.$options.data.apply(this))
cc, этот ответ был изначально здесь
Поскольку блок try
в test2 ()
не имеет ловушки
], только , наконец,
. Код не будет «перепрыгивать» к вызывающему, чтобы попасть в catch
, а затем «прыгать вперед» к finally
, чтобы продолжить там, как вы, кажется, думаете.
Вот ключевые моменты:
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)
Поскольку блок finally
всегда выполняется непосредственно перед выходом из области видимости. Последовательность событий после вызова test2()
выглядит следующим образом:
test2()
test2
не имеет блока catch
, исключение распространяется до звонящего. test2
имеет блок finally
, он выполняется перед возвратом из метода. catch
в основном методе ловит исключение. Потому что 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 , моя точка зрения заключалась в следующих условиях: который окончательный код не выполняется.
Пробный блок выполняется первым. Catch выполняется, если в блоке try есть исключение, которое необходимо перехватить. Наконец, блок выполняется в обоих случаях независимо от того, есть ли исключение или нет. Если в блоке try есть оператор return, то перед возвратом в блок try выполняется блок finally, а затем выполняется блок return в блоке try.
catch идет перед finally в той же области видимости try-catch-finally.
В test2 в области видимости try-catch-finally test2 нет catch, поэтому он выполняет finally, прежде чем покинуть область видимости и попасть в вышестоящую catch.
try - catch и finally используются для предотвращения ситуаций, когда программа может завершиться из-за возникновения нежелательной ошибки во время ее выполнения.
Следующие пункты важны....
1)Существует только одна попытка для блока...... любое количество операторов catch для блока и только один finally для блока утверждений
2)finally является необязательным.
3) catch также необязателен, но если оператор catch отсутствует, то finally должен появиться.
4) Все catch, соответствующие дочерним исключениям, должны появляться перед catch для родительского исключения.
5) Независимо от возникновения исключения утверждения, присутствующие в блоке finally, выполняются всегда с одним исключением.
т.е. если встречается оператор System.out.exit(), то программа немедленно завершается, поэтому finally не может быть выполнен в таких случаях.
Примечание: даже если в блоке try встречается оператор return ... тогда также выполняется код в finally.
Если вы замените функции кодом методов, вы получите:
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 на внешнем уровне, но последнее, расположенное на внутреннем уровне, выполняется первым.