Вы запускаете свои варианты переключения в предположении, что переменная json
всегда определена, но если блок catch()
запущен, это означает, что ваша переменная json
будет неопределенной:
function example(value) {
var json;
try {
json = JSON.parse(value);
} catch (err) {
// couldn't parse the value, so you catch an error
console.error(err);
return "catch";
} finally {
// an error got caught, this block runs regardless, and now json is undefined
console.log(`json variable: ${json}`);
}
}
const result = example(";");
console.log(result);
Вы также предполагаете, что если у вас есть оператор return в блоке catch()
, это остановит выполнение блока finally
, но это не так. правда. Блок finally
выполнит свой код и только после этого вернет какой-нибудь оператор.
Также обратите внимание, что если у вас есть оператор return как в блоке catch
, так и в finally
, то finally
Оператор return будет иметь приоритет над другим:
function example(value) {
var json;
try {
json = JSON.parse(value);
} catch (err) {
// couldn't parse the value, so you catch an error
console.error(err);
return "catch";
} finally {
// but this return statement takes priority over catch
return "finally";
}
}
const result = example(";");
console.log(result);