Как справиться с возможной неуловимой ошибкой в Javascript?

#javascript #node.js #exception #error-handling #jsforce

Вопрос:

У меня есть очень маленькая программа в index.js, он пытается установить соединение с несуществующим URL-адресом и делает запрос в рамках этого соединения. Когда это происходит, я хочу поймать и обработать любые ошибки, но я получаю ENOTFOUND предупреждение, и оно вынуждает мою программу выйти. Как мне поймать эту ошибку и правильно ее обработать?

Index.js:

 const jsforce =  require("jsforce");


conn = new jsforce.Connection({
  accessToken: "",
  instanceUrl: "http://thisdoesnotexistalsdkfjalsdkfjasdlkfjasdlkfjalsdkfja.com",
  version: "51.0",
  callOptions: {
    client: `sf-fx-runtime-nodejs-sdk-impl-v1:1`
  }
});

const response = conn.query("SELECT foo from bar");
console.log(response);

response.then(
undefined,
function foo(e) {
  console.log("======================== lol")
  console.log(e)
})
 

Фактический:

 $ node index.js
/Users/rschneeman/Documents/projects/work/nodejs-uncatachable-error-maybe/node_modules/node-fetch/lib/index.js:1461
      reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
             ^
FetchError: request to http://thisdoesnotexistalsdkfjalsdkfjasdlkfjasdlkfjalsdkfja.com/services/data/v51.0/query?q=SELECT foo from bar failed, reason: getaddrinfo ENOTFOUND thisdoesnotexistalsdkfjalsdkfjasdlkfjasdlkfjalsdkfja.com
    at ClientRequest.<anonymous> (/Users/rschneeman/Documents/projects/work/nodejs-uncatachable-error-maybe/node_modules/node-fetch/lib/index.js:1461:11)
    at ClientRequest.emit (node:events:369:20)
    at Socket.socketErrorListener (node:_http_client:462:9)
    at Socket.emit (node:events:369:20)
    at emitErrorNT (node:internal/streams/destroy:188:8)
    at emitErrorCloseNT (node:internal/streams/destroy:153:3)
    at processTicksAndRejections (node:internal/process/task_queues:81:21) {
  type: 'system',
  errno: 'ENOTFOUND',
  code: 'ENOTFOUND'
}
 

Ожидаемый:

 $ node index.js
======================== lol
      reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
(logged but doesn't force exit the process)
 

Комментарии:

1. Звучит как сообщение об ошибке для jsforce, а не вопрос для StackOverflow 🙂 Ваш код в порядке.

Ответ №1:

Ваше дело похоже на ситуацию «попробуй/поймай«. Вы можете сделать что-то вроде:

 try {
  //do stuff
catch (error) {
  //handle your error
}
 

Возможно, вы также захотите взглянуть на Обещания.