> 웹 프론트엔드 > JS 튜토리얼 > JavaScript 디버깅의 숨겨진 보석: error.cause

JavaScript 디버깅의 숨겨진 보석: error.cause

DDD
풀어 주다: 2025-01-12 16:45:47
원래의
685명이 탐색했습니다.

A Hidden Gem in JavaScript Debugging: error.cause

디버깅의 과제

디버깅에 있어 가장 큰 어려움은 무엇인가요? 그 중 하나는 의심할 바 없이 오류의 원인을 추적하는 것입니다.

다음 시나리오를 상상해 보세요.

const func = () => {
  doSth('A');
  doSth('B');
};
로그인 후 복사
로그인 후 복사

func에서 오류가 발생하면 오류가 발생한 단계를 어떻게 식별하나요? doSth('A'), doSth('B') 또는 func 자체로 인해 발생했나요? 분명히 오류에는 충분한 맥락이 부족합니다.

공통 솔루션

이 문제를 해결하기 위한 일반적인 접근 방식은 다음과 같습니다.

const func = () => {
  try {
    doSth('A');
  } catch (error) {
    throw new Error('An error from A', error);
  }
  try {
    doSth('B');
  } catch (error) {
    throw new Error('An error from B', error);
  }
};
로그인 후 복사
로그인 후 복사

이 방법을 사용하면 오류의 원인을 더 쉽게 찾을 수 있습니다. 그러나 이 솔루션에는 몇 가지 제한 사항이 있습니다.

  1. 오류 세부 정보 손실:

    오류에 광범위한 정보(예: 페이로드, HTTP 상태 코드, 오류 코드)가 포함된 경우 이 접근 방식은 새로 생성된 오류에 doSth의 오류 메시지만 추가합니다. 원본 스택 추적을 포함한 기타 중요한 세부 정보는 손실됩니다.

  2. 로그 가독성 저하:

    잠재적인 오류 지점이 2개 이상 있으면 로그가 복잡해지고 해석하기 어려울 수 있습니다.

  3. 의도 표현의 모호함:

    코드는 특정 doSth 함수가 포착되어 새로운 오류가 발생했다는 사실을 명시적으로 전달하지 않으므로 코드 가독성을 높일 여지가 있습니다.

error.cause 소개

이러한 문제를 해결하기 위해 ECMAScript 2022에서는 error.cause를 도입했습니다.

이 기능을 사용하면 개발자는 새 오류 개체를 생성할 때 오류의 근본 원인을 지정할 수 있습니다. error.cause를 사용하면 일련의 오류를 설정하여 문제의 근본 원인을 더 쉽게 디버깅하고 추적할 수 있습니다.

다음은 간단한 예입니다.

try {
  // Some operation that may throw an error
} catch (error) {
  throw new Error('Something went wrong', { cause: error });
}
로그인 후 복사

이 접근 방식을 사용하면 오류 간의 인과 관계를 구축할 수 있습니다. 예를 들면 다음과 같습니다.

const func = () => {
  try {
    doSth('A');
  } catch (error) {
    throw new Error('An error from A', { cause: error });
  }
  try {
    doSth('B');
  } catch (error) {
    throw new Error('An error from B', { cause: error });
  }
};
로그인 후 복사

이를 통해 하위 수준 함수(예: doSth('A'))에서 발생하는 오류를 포착하고 관련 컨텍스트를 추가하는 새 오류(예: "doSth('A')를 실행하는 동안 오류가 발생했습니다.")를 발생시킬 수 있습니다. ), 원래 오류 세부정보(예: "A는 잘못된 인수입니다.")를 보존합니다.

일련의 오류 만들기

error.cause의 또 다른 장점은 연결된 오류 체인을 생성하여 개발자가 애플리케이션의 여러 계층을 통해 문제를 다시 추적할 수 있다는 것입니다.

const func = () => {
  try {
    try {
      try {
        doSth('A');
      } catch (error) {
        throw new Error('Error at depth 3', { cause: error });
      }
    } catch (error) {
      throw new Error('Error at depth 2', { cause: error });
    }
  } catch (error) {
    throw new Error('Error at depth 1', { cause: error });
  }
};

console.log(error.cause.cause); // Error at depth 3
로그인 후 복사

Node.js에서는 원인이 있는 오류를 콘솔에서 특별히 처리합니다. 관련된 모든 오류 스택이 인쇄됩니다.

const func = () => {
  doSth('A');
  doSth('B');
};
로그인 후 복사
로그인 후 복사

결론

  • 오류 컨텍스트와 세부 정보에 즉시 액세스할 수 있으면 디버깅이 훨씬 쉬워집니다.
  • 이를 달성하는 효과적인 방법 중 하나는 error.cause 기능을 사용하여 "컨텍스트에 따라 다시 발생" 패턴을 채택하는 것입니다.
const func = () => {
  try {
    doSth('A');
  } catch (error) {
    throw new Error('An error from A', error);
  }
  try {
    doSth('B');
  } catch (error) {
    throw new Error('An error from B', error);
  }
};
로그인 후 복사
로그인 후 복사

이 접근 방식은 오류 추적 가능성을 향상시킬 뿐만 아니라 코드의 가독성과 유지 관리 가능성도 향상시킵니다.


우리는 Node.js 프로젝트를 클라우드에 배포하기 위한 최고의 선택인 Leapcell입니다.

A Hidden Gem in JavaScript Debugging: error.cause

Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.

다국어 지원

  • Node.js, Python, Go 또는 Rust를 사용하여 개발하세요.

무제한 프로젝트를 무료로 배포

  • 사용한 만큼만 지불하세요. 요청이나 요금이 부과되지 않습니다.

탁월한 비용 효율성

  • 유휴 비용 없이 사용한 만큼만 지불하세요.
  • 예: $25는 평균 응답 시간 60ms에서 694만 개의 요청을 지원합니다.

간소화된 개발자 경험

  • 손쉬운 설정을 위한 직관적인 UI.
  • 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
  • 실행 가능한 통찰력을 위한 실시간 측정항목 및 로깅.

손쉬운 확장성과 고성능

  • 자동 확장을 통해 높은 동시성을 쉽게 처리할 수 있습니다.
  • 운영 오버헤드가 전혀 없습니다. 구축에만 집중하세요.

문서에서 더 자세히 알아보세요!

A Hidden Gem in JavaScript Debugging: error.cause

X에서 우리를 팔로우하세요: @LeapcellHQ


저희 블로그에서 읽어보세요

위 내용은 JavaScript 디버깅의 숨겨진 보석: error.cause의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿