NodeJS Express의 예외 처리



오류 디버깅은 프로그래밍에서 가장 어려운 부분입니다. 오류는 구문 오류, 논리 오류 또는 가장 무서운 런타임 오류 등 다양한 방식으로 코드에 나타날 수 있습니다. 런타임 오류는 응용 프로그램에서 예기치 않은 일이 발생할 때마다 발생하며 종종 프로그램을 중단시킬 수 있는 치명적인 문제로 이어집니다.

많은 언어와 마찬가지로 Node.js는 오류가 발생하기 전에 예측하는 메커니즘을 제공합니다. 코드에서 오류가 발생하면 예외라는 개체가 됩니다. 이러한 예외를 적절하게 처리하면 예기치 않은 문제로부터 정상적으로 복구할 수 있으므로 훨씬 더 나은 사용자 경험을 얻을 수 있습니다.

목차


  • 예외 생성
  • 오류 개체
  • 예외 처리
  • 포착되지 않은 예외 포착
  • 약속이 있는 예외
  • 동기식 오류 처리
  • 익스프레스에서 오류 처리

  • 예외 만들기



    예외는 throw 키워드를 사용하여 생성됩니다.



    JavaScript가 이 줄을 실행하는 즉시 정상적인 프로그램 흐름이 중단되고 가장 가까운 예외 처리기로 제어가 보류됩니다.

    일반적으로 클라이언트 측 코드에서 값은 문자열, 숫자 또는 객체를 포함한 모든 JavaScript 값이 될 수 있습니다.

    Node.js에서는 문자열을 던지지 않고 Error 객체만 던집니다.

    오류 객체



    오류 객체는 Error 객체의 인스턴스이거나 Error 코어 모듈에서 제공되는 Error 클래스를 확장하는 객체입니다.



    예외 처리



    예외 핸들러는 try/catch 문입니다.

    try 블록에 포함된 코드 줄에서 발생한 모든 예외는 해당 catch 블록에서 처리됩니다.

    try {
      // lines of code
    } catch (e) {}
    
    


    이 예에서 e는 예외 값입니다.

    다양한 종류의 오류를 포착할 수 있는 여러 핸들러를 추가할 수 있습니다.

    약속이 있는 예외



    약속을 사용하면 여러 작업을 연결하고 마지막에 오류를 처리할 수 있습니다.

    
    performFunction1()
      .then(performFunction2)
      .then(performFunction3)
      .catch(err => console.error(err));
    
    


    어디에서 오류가 발생했는지 어떻게 알 수 있습니까? 실제로는 모르지만 호출하는 각 함수(performfunction(x))에서 오류를 처리할 수 있고 오류 처리기 내부에서 새 오류를 발생시켜 외부 catch 처리기를 호출할 수 있습니다.

    const performFunction1 = () => {
      // ...
      try {
        // ...
      } catch (err) {
        // ... handle it locally
        throw new Error(err.message);
      }
      // ...
    };
    


    우리가 호출하는 함수에서 오류를 처리하지 않고 로컬에서 오류를 처리할 수 있도록 체인을 끊을 수 있습니다. 각 then()에서 함수를 만들고 예외를 처리할 수 있습니다.

    performFunction1()
      .then(() => {
        return performFunction2().catch(err => {
          // handle error
          throw err; // break the chain!
        });
      })
      .then(() => {
        return performFunction3().catch(err => {
          // handle error
          throw err; // break the chain!
        });
      })
      .catch(err => console.error(err));
    
    


    익스프레스에서 오류 처리



    오류 처리는 Express가 동기식 및 비동기식으로 발생하는 오류를 포착하고 처리하는 방법을 나타냅니다. Express는 기본 오류 처리기와 함께 제공되므로 시작하기 위해 직접 작성할 필요가 없습니다.

    Express가 경로 핸들러 및 미들웨어를 실행하는 동안 발생하는 모든 오류를 포착하는지 확인하는 것이 중요합니다.

    경로 처리기 및 미들웨어 내부의 동기 코드에서 발생하는 오류는 추가 작업이 필요하지 않습니다. 동기 코드에서 오류가 발생하면 Express가 오류를 포착하여 처리합니다. 예를 들어:

    app.get('/', (req, res) => {
      throw new Error('BROKEN') // Express will catch this on its own.
    })
    


    라우트 핸들러 및 미들웨어에 의해 호출된 비동기 함수에서 반환된 오류의 경우 Express가 오류를 포착하고 처리하는 next() 함수로 전달해야 합니다. 예를 들어:

    app.get('/', (req, res, next) => {
      fs.readFile('/file-does-not-exist', (err, data) => {
        if (err) {
          next(err) // Pass errors to Express.
        } else {
          res.send(data)
        }
      })
    })
    


    Promise를 반환하는 비동기 코드, 경로 처리기 및 미들웨어의 오류는 오류를 거부하거나 throw할 때 next(value)를 자동으로 호출합니다. 예를 들어:

    app.get('/user/:id', async (req, res, next) => {
    try{
      const user = await getUserById(req.params.id)
      res.send(user)}
    catch(err){next(err)}
    })
    

    좋은 웹페이지 즐겨찾기