Можете ли вы указать обработчик try без перехвата или, наконец, блокировать в ES? - PullRequest
1 голос
/ 17 мая 2019

Есть ли способ определить блок try без перехвата в JavaScript?

Компилятор жалуется со следующим кодом:

try {
    const newAPI = require("applicationutils");
}

FYI Месяц за месяцем вводятся новые API. В моем случае, если API доступен, я хочу новый курс действий. Если они недоступны, я буду использовать настройки по умолчанию. Мне не нужен блок улова. Я просто хочу знать, возможно ли это.

Если класс не существует, код выдает ошибку, поэтому он должен быть заключен в блок catch.

Ответы [ 2 ]

4 голосов
/ 17 мая 2019

Невозможно использовать try без catch и / или finally. Согласно MDN, попробуйте ... поймать :

Оператор try состоит из блока try, который содержит один или несколько заявления. {} всегда должен использоваться, даже для отдельных операторов. В должно присутствовать хотя бы одно предложение catch или предложение finally. это дает нам три формы для заявления try:

try...catch
try...finally
try...catch...finally
0 голосов
/ 17 мая 2019

Вы можете сделать что-то, как показано ниже, где «области видимости» определены встроенными в вашем теле функции, что эффективно достигает того, что вам нужно.

Они определяются { .. } непосредственно в вашей функции и вводят новые части лексической / переменной области видимости в вашу функцию, где, например, может быть определена переменная, которая доступна только внутри области действия этого блока.

Исключения могут быть выброшены из этих областей встроенных блоков и будут перехвачены обработчиком catch, определенным в предыдущей точке в стеке вызовов:

function foo() {
    /* Start a block scope in function foo() */
    {
        /* newAPI only accessible in this block scope */
        const newAPI = require("applicationutils");
    }

    /* Start another block scope, defined in same function foo() */
    {           
        /* newAPI is unique to this block, the newAPI variable name
           can be re-used seeing it's unique in the lexical scope */
        const newAPI = { getUsers : () => [] };

       /* Throwing an exception from block scope is okay - it does not
          need to be handled with a catch() clause on this block, and
          will be handled by an optional catch() clause lower in the 
          call stack */
       throw new Error('throwing from second block scope in foo()');
    }
    /* no catch(..) {} clause is syntactically required */
}
...