NodeJS использовать ошибки для c конкретных случаев - PullRequest
1 голос
/ 05 августа 2020

Я использую следующую функцию, которая работает нормально, однако у меня есть проблема с обработкой ошибок

, например,

Я хочу поймать общую c ошибку для все функции

Если fn1 или fn2 возвращает какую-либо ошибку, функция должна выдать 'generi c ошибка произошла`

Вот что мне нужно

, если getData2 не имеет указанного c значения свойства (см. if), вернуть uniq error uniq error occurred и not общая ошибка ...

Это рабочий пример

https://jsfiddle.net/8duz7n23/

async function func1() {
  try {
    const data = await getData1()
    console.log(data)
    const data2 = await getData2();
    if (!data2.url === !"https://test2.com") {
      throw new Error("uniq error occurred  ")
    }
    return data2.url
  } catch (e) {
    throw new Error("generic error occurred ")
  }
}

async function getData1() {
  return "something"
}

async function getData2() {
  return {
    url: "http://test.com"
  }
}

func1().then(result => {
  console.log(result);
}).catch(error => {
  console.log(error);
});

Теперь, если я выброшу ошибку uniq , catch выдаст общую ошибку.

Я хочу это на случай func2 будет некоторая ошибка, он все равно выбрасывает общую ошибку, но если у вас есть правильный URL-адрес, полностью переместите uniq error ...

Есть ли более чистый способ для сделать это в nodejs?

Я не хочу использовать оператор if для сообщений в catch et c ...

Я хочу, чтобы бросил к функции верхнего уровня , а не к ловушке

1 Ответ

1 голос
/ 05 августа 2020

Чтобы распространить ошибку на «верхний уровень», вам придется снова выбросить ее в блоке catch.

Вы можете добавить свой собственный тип ошибки и проверить, соответствует ли ошибка тому, что вы ищете за или нет.

class UrlMismatchError extends Error {
  name="UrlMismatchError"
}

async function func1() {
  try {
    const data = await getData1()
    console.log(data)
    const data2 = await getData2();
    if (data2.url !== "https://test2.com") {
      throw new UrlMismatchError("uniq error occured");
    }
    return data2.url
  } catch (e) {
    if (e instanceof UrlMismatchError) {
      throw e;
    } else {
      // handle generic errors
      throw new Error("generic error occured");
    }
  }
}

async function getData1() {
  return "something"
}

async function getData2() {
  return {
    url: "http://test.com"
  }
}

func1().then(result => {
  console.log(result);
}).catch(error => {
  console.error(error.message);
});

Я не хочу использовать оператор if для сообщений в catch et c ...

Я хочу, чтобы это было в функцию верхнего уровня, а не в ловушку

Нет, вы не можете этого сделать, потому что javascript не java, поэтому вы не можете сделать что-то вроде следующего:

// the code snippet below wont work
try {
  doSomething();
} catch(UrlMismatchError e) {
  // propagate error to the upper level
  throw e;
} catch(Error e) {
  // handle all the other errors
  console.log(e);
}
...