предисловие
У меня наконец-то есть время обновить свой блог на выходных.Прежде всего, я очень благодарен "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 .. :)