предисловие
У меня наконец-то есть время обновить свой блог на выходных.Прежде всего, я очень благодарен "justjavac" за написание специальной статьи для моей статьи.Опровергнуть »Попробуйте поймать с осторожностью», позвольте мне узнать много (например,ChromeизPause on exceptionsфункция), а также заставил меня осознать, что некоторые пункты знаний действительно недостаточно глубоки, и не хватает баз цитирования, но некоторые слова «justjavac» более экстремальны, что может легко ввести читателей в заблуждение, и также ведут к прямому знанию определенных знаний.Вырывайте их из контекста и делайте обобщения (такие как:try catchНе беспокойтесь о проблемах с производительностью вообще). Поэтому я решил пересмотреть этот блог, надеясь показать вам самые точные галантерейные товары, и приветствую ваших друзей, чтобы комментировать и оставлять сообщения.
С момента введения ECMA-262 версии 3try catchоператор, как стандартный способ обработки исключений в JavaScript. Основной синтаксис показан ниже.
Во-первых, попробуйте поймать основной закон
try {
//可能会导致错误的代码
} catch (error) {
//在错误发生时怎么处理
}finally {
//即使报错始终执行
}
Во-вторых, попробуйте поймать функции
1. попробуйте поймать потребляет производительность
1.1 принцип производительности try catch
ECMAScript 2015 -The try Statement
13.15.5 Static Semantics: VarDeclaredNames
- TryStatement : try Block Catch Finally
- 1.Let names be VarDeclaredNames of Block.
- 2.Append to names the elements of the VarDeclaredNames of Catch.
- 3.Append to names the elements of the VarDeclaredNames of Finally.
- 4.Return names.
13.15.6 Static Semantics: VarScopedDeclarations
- TryStatement : try Block Catch Finally
- 1.Let declarations be VarScopedDeclarations of Block.
- 2.Append to declarations the elements of the VarScopedDeclarations of Catch.
- 3.Append to declarations the elements of the VarScopedDeclarations of Finally.
- 4.Return declarations.
Согласно вышеизложенномуECMAScript文档的13.15.5和13.15.6`.
Ниже приводится только собственный перевод и понимание моей сестры, только для справки.
Вышеупомянутое примерно сказано, чтобы бежатьtry catch, необходимо добавить текущее лексическое окружение и область видимости вcatchа такжеFinallyв блоке кода, который должен быть выполнен. Из вышеизложенного можно сделать выводtry catchпотребляет производительность.
1.2 попробуйте поймать эксперимент производительности
Ниже я используюChrome62а такжеIE9добавить несколькоtry catch, для проведения сравнительного эксперимента, правда, хотелось бы отказаться万恶的IE, но многие отечественные продукты не согласны, если только мы не пойдем в спортзал, чтобы больше тренироваться и бороться, хе-хе~~
1.2.1 Экспериментальные данные:
//没有加try catch
(function () {
var i = 0;
i++;
}())
//有try catch
(function () {
var i = 0;
try {
i++;
} catch (ex) {
} finally {
}
}())
1.2.2 Экспериментальные результаты:
1.2.3 Ссылка на эксперимент:
Сравнение вышеуказанных экспериментальных данных, известно, чтоtry catchбудет потреблять производительность, ноtry catchправильноChromeкоэффициент воздействияIE11Гораздо меньше, говорят, что это новый компилятор для двигателя V8.TurboFanРоль сыграна, заинтересованные друзья могут посмотретьv8_8h_source из строки 3354,ноIE11Это намного медленнее. Это основано на бизнес-объектах друзей.Если только для современных браузеров,try catchВлияние на производительность потребления будет минимальным; если требуется совместимостьIEили встроенный в бюджетныйwebView, может быть уместно рассмотреть следующееtry catchпотреблять производительность.
2. try catch не может отлавливать асинхронные ошибки
попробуйте сделать это асинхронным методомtry catchОперация может перехватывать исключения только в тех случаях, когда цикл событий, созданный при выполнении исключения обратного вызова, бессилен.
try {
setTimeout(()=>{
const A = 1
A = 2
},0)
} catch (err) {
// 这里并不能捕获回调里面抛出的异常
console.log("-----catch error------")
console.log(err)
}
Если вы хотите перехватывать исключения в асинхронных ситуациях, рекомендуется обернуть слой в асинхронную функцию.try catch.
setTimeout(() => {
try {
const A = 1
A = 2
} catch (err) {
console.log(err)
}
}, 0)
3. try catch выдает ошибку
а такжеtry-catchЕсть еще одно подходящее предложениеthrowОператор, который бросает пользовательские ошибки в любое время и может создавать пользовательские сообщения об ошибках в соответствии с различными типами ошибок.
throw new Error("Something bad happened.");
throw new SyntaxError("I don’t like your syntax.");
throw new TypeError("What type of variable do you take me for?"); throw new RangeError("Sorry, you just don’t have the range.");
throw new EvalError("That doesn’t evaluate.");
throw new URIError("Uri, is that you?");
throw new ReferenceError("You didn’t cite your references properly.");
Если вы чувствуете себя неопределенной ошибкой необоснованно, хотите увидеть оригинальную ошибку, вы можете использоватьChromeизPause on exceptionsФункция
3. Используйте try catch с осторожностью
try catchЛучше всего подходит для работы с ошибками, которые находятся вне нашего контроля, такими какI/Oоперации и т. д., бэкэндnodeJsилиjavaчитатьI/OЕсть много операций, таких как чтение базы данных, поэтому используйтеtry catchболее. Внешний интерфейс можно использовать для загрузки изображений и использования чужихjsошибка библиотеки,async awaitОн подходит для интерфейса синхронной регулировки и других мест.
async function f() {
try {
await Promise.reject('出错了');
} catch(e) {
}
return await Promise.resolve('hello world');
}
Но большая часть клиентского кода, работающего с внешним интерфейсом, не очень зависит от среды и не имеетI/OВсе операции — это код, написанный вами самостоятельно. Когда вы точно знаете, что в вашем коде будут ошибки, используйте его снова.try catchУтверждение не подходит.В соответствии с ошибкой типа данных рекомендуется, чтобы друзья использовали назначение деструктурирования, чтобы указать значение по умолчанию,&&а также||Чтобы этого избежать, используйте try catch с осторожностью.
foo = (obj = {}) => {
let obj1 = result || {};
if (obj && obj.code) {
console.log('obj.code',obj.code)
}
}
использованная литература
Happy coding .. :)