Pull to refresh

Comments 10

Вот бы ещё рассказали, что полезного содержится в том объекте, который передаётся в блок catch…
а я освежил память о тегированных шаблонах, и как они работают
Про try/catch считаю обязательным упомянуть, что в catch не попадут брошенные исключения из асинхронных функций внутри блока try.
Попадут

async function test() {
    await test1()
}

async function test1() {
    await test2()
}

async function test2() {
    throw Error("hi, i'm error from async function")
}

async function go() {
    try {
        await test()
    }
    catch (e) {
        console.log(e)
    }
}

go()

// Error: "hi, i'm error from async function"
У вас код в синхронном стиле потому что, вы везде ожидаете результат посредством await.
Приведу свой простой пример.

try {
	setTimeout(() => {
		throw new Error('sdfsdfdf');
	}, 10);
} catch (e) {
	console.log(777, e);
}


Аналогично исключение не будет перехватываться и в запросах к серверу, а так же если мы будем вешать обработчики на события от мыши и клавиатуры.
	setTimeout(() => {
             try {
		throw new Error('sdfsdfdf');
             } catch (e) {
	        console.log(777, e);
             }
	}, 10);

так будет работать. область видимости как и с переменными. Ее лучше не нарушать и каждой функции свой обработчик…
Как и везде не указанно зачем нужен блок finally.
Возьмём пример:
function foo(a, b) {
  let result;
  try {
    result = a.concat(b);
  } catch(e) {
    if(!a) {
      a = '';
    }
    if(!b) {
      b = '';
    }
    result = `${a}`.concat(b);
  } finally {
    return result;
  }
}


Тут finally бесполезен — его можно просто убрать.
А вот в этом примере он использован вполне оправданно:
function foo(data, source) {
  try {
    data.a = source.a.b.c.d;
    data.b = source.x.y.z;
    // data.c = ....
  } catch(e) {
    console.error(`Data is incoplete`);
    throw e;
  } finally {
    sendToServer(data);
  }
}

Если при присваивании выпрыгнет исключение — мы всёравно отправим данные на сервер. А исключение обработаем потом.
хотя здесь тоже можно sendToServer поместить в блоке catch до выброса ошибки
где-то в просторах java читал, что finally удобно, когда, скажем, нужно открыть коннект к БД, запросить данные и независимо от результата, закрыть коннект к БД
в этом случае в блоке catch будет стандартная логика обработки ошибки, а в блоке finally только закрытие коннекта
Да — чаще всего файнали используеться для очистки рессурсов. Но нет смысла ставить файнали — если в кэтч не выбрасываеться исключение.
Нет — если перенести sendToServer в кэтч блок — то данные будут отправляться только если возникло исключение — что не совсем так как я задумывал в данном примере :)
Объяснит, пожалуйста, вот это кусок const es = helper`ES ${esth} is ` Вроде как тут скобки должны быть с аргументами, а на самом деле что?
Sign up to leave a comment.