Используйте try catch с осторожностью

внешний интерфейс JavaScript

предисловие

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

Ниже приводится только собственный перевод и понимание моей сестры, только для справки.

Вышеупомянутое примерно сказано, чтобы бежатьtry catch, необходимо добавить текущее лексическое окружение и область видимости вcatchа такжеFinallyв блоке кода, который должен быть выполнен. Из вышеизложенного можно сделать выводtry catchпотребляет производительность.

1.2 попробуйте поймать эксперимент производительности

webwxgetmsgimg.jpeg

Ниже я использую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 Экспериментальные результаты:

chrome62-simple.png

IE11-simple.png

chrome62-more.png

IE11-more.png

1.2.3 Ссылка на эксперимент:

JSP и F.com/test-try-rub...

JSP и F.com/test-try-rub...

Сравнение вышеуказанных экспериментальных данных, известно, что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Функция

image.png

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 .. :)