JavaScript 오류 처리에 대한 모범 사례는 무엇입니까?


137

내 자바 스크립트를 좀 더 오류 증거를 만들기 시작 찾고 있어요, 내가 사용하는 방법에 대한 문서를 많이 찾는거야 try, catch, finally,와 throw,하지만 난 오류가 발생하는 시간과 장소에 전문가의 조언의 톤을 찾는 게 아니에요.

  • 모든 코드 조각을 try / catch로 감싸 야합니까?
  • 오류가 발생하는 시점 이와 같은 조언이 더 있습니까?
  • 프로덕션 환경에서 코드가 자동으로 실패하는 대신 오류를 발생시키는 단점이 있습니까?
  • 이것은 구현에 이르기까지 SO에서 다루어졌지만 서버 로깅 JS 오류가 효과적인 전략입니까?
  • 내 응용 프로그램의 트래핑 오류와 관련하여 알아야 할 것이 있습니까?

또한 오류 처리에 대한 장이나 깊이있는 설명이있는 책을들을 수있는 게임입니다. Eloquent JavaScript 는이 문제를 다루지 만 문제에 대해 매우 규범 적이거나 의견이 많지 않습니다.

당신이 줄 수있는 조언에 감사드립니다!


문제가 발생했을 때 얼마나 놀라운 일이 발생했는지와 가능한 오류 메시지의 양에 달려 있습니다. 오류 로깅 디렉토리가 가득 차서 실패하지 않습니까? -여기 보셨어요? stackoverflow.com/search?q=error+logging+javascript
mplungjan

@mplungjan-거기에 대한 답변을 스캔했지만 정식으로 보이지는 않았고 Javascript 오류 처리 / 예외 모범 사례를 검색해도 아무런 변화가 없었으므로 일부 의견을 모색하는 것이 도움이 될 수 있다고 생각했습니다. 자신의 이해와 미래의 검색 자. 아마도 이것은 모범 사례를 처방 할 수없는 주제이지만 각 상황이 매우 독특합니까?
Joshua Cody

1
"모든 코드 조각을 try / catch로 포장해야합니까?" 당연히 아니지. 항상 작동하는 것으로 알고있는 많은 코드가 있습니다 (물론 테스트한다고 가정하지만 try / catch의 요점은 코딩 오류를 포착하거나 광택 화하지 않는 것입니다). 제어 할 수없는 것, 일반적으로 리소스 액세스 등으로 인해 어느 정도 실패 할 수있는 코드 만 래핑합니다. 참고 : 실패 할 수있는 일부 오류 처리 기능이 내장되어 있습니다. 크로스 브라우저 문제를 처리하고 오류 처리기 기능을 지정할 수있는 라이브러리가 많이 있습니다.
nnnnnn

1
이것은 좋은 질문입니다. Josh, +1. 많은 문법 조언이 있지만 당신이 말한 것처럼 쉬운 부분입니다. 이 질문에 대한 답변 ( stackoverflow.com/questions/2825427/… )에서 예외가 JS에서 일반적으로 사용되지 않으며 이유가 제시되어 있음을 설명합니다.
whitneyland

답변:


63

엔터프라이즈 JavaScript 오류 처리에 대한 매우 흥미로운 슬라이드 세트는 http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/ 에서 찾을 수 있습니다 .

요약하면 다음과 같습니다.

  1. 코드가 실패한다고 가정
  2. 서버에 오류 기록
  3. 브라우저가 아닌 오류 처리
  4. 오류가 발생할 수있는 곳 식별
  5. 자신의 실수를 던져
  6. 치명적 오류와 비 치명적 오류 구분
  7. 디버그 모드 제공

슬라이드는 훨씬 더 자세하게 설명되며 대부분 방향을 알려줍니다.

최신 정보

위에서 언급 한 프레젠테이션은 여기에서 찾을 수 있습니다 : http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation


24
devhands 링크가 깨졌습니다.
Ryan Gates

7
2017 년에 이것을 읽은 사람들에게는 슬라이드에서 많은 가치를 얻지 못할 것이라고 주장합니다.이 요약은 정보의 90 %를 제공합니다. 여전히 유용한 정보입니다. 건배!
Philippe Hebert

29

Yahoo!의 Nicholas Zakas! fame는 Ajax Experience 2008에서 Enterprise Error Handling ( 슬라이드 )에 대해 다음과 같이 이야기했습니다 .

function log(sev,msg) {
    var img = new Image();
    img.src = "log.php?sev=" +
        encodeURIComponent(sev) +
        "&msg=" + encodeURIComponent(msg);
}

// usage
log(1, "Something bad happened.")

// Auto-log uncaught JS errors
window.onerror = function(msg, url, line) {
    log(1, msg);
    return true;
}

1 년 후, Nicholas Zakas는 자신의 블로그 에 프로덕션 환경에서 자동으로 오류 처리 코드를 삽입하기위한 영리한 패턴을 포함한 업데이트를 게시했습니다 (종횡비 프로그래밍 사용).

window.error 호출 로깅을 시작하면 다음 두 가지가 있습니다.

  1. 사이트가 상당히 복잡한 경우 많은 오류 를 기록하게됩니다
  2. 당신은 쓸모없는 "window.error in undefined : 0"메시지를 보게 될 것입니다

로그 항목 토렌트를 줄이는 것은 서버에 로깅하기 전에 심각도 및 / 또는 난수를 테스트하는 것만 큼 간단합니다.

function log(sev,msg) {
    if (Math.random() > 0.1) return; // only log some errors

    var img = new Image();
    img.src = "log.php?sev=" +
        encodeURIComponent(sev) +
        "&msg=" + encodeURIComponent(msg);
}

쓸데없는 "window.error in undefined : 0"오류를 처리하는 것은 사이트 아키텍처에 따라 다르지만 모든 Ajax 호출을 식별하고 무언가 실패 할 경우 예외를 발생시킬 수 있습니다 ( stacktrace.js를 사용하여 스택 추적을 반환 할 수 있음 ).


67
나는 이것이 오래된 질문이라는 것을 알고 있지만 일부 오류를 무작위로 무시하는 것은 내가 들어 본 최악의 아이디어 중 하나입니다.
jbabey

26
@jbabey : 소규모 사이트의 경우에는 맞지만 100,000 또는 수백만 명의 사용자가있는 대규모 사이트를 실행하는 경우 중복 로깅 요청으로 서버 (또는 인터넷)를 과도하게 사용하지 않아도됩니다. 충분히 큰 시스템에서 모든 실제 오류는 하루에 수만 번 발생하므로 이러한 제한 형식은 제대로 작동합니다. 아이디어는 실제로 Facebook에서 구현됩니다.
Jens Roland

1
디버깅 모드에서 로깅 오류는 프로덕션 오류 보고서를 제한하는 것만 큼 중요 할 수 있으므로 로깅 임계 값을 제한하는 해당 값을 관리하려면 솔루션이 필요합니다.
frattaro

2
@NickBull 2011-2012 년에 Facebook의 JavaScript 모듈을 리버스 엔지니어링했습니다. 내가 찾은 곳이야
Jens Roland

1
@NickBull은 방금 이전 파일을 확인했지만 여전히이 파일을 가지고 있습니다. Facebook 부트 로더 모듈에서이 트릭을 발견했습니다 : if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {(이 코드는 모든 오류를 제한하지 않고 특정 시간 종료 오류 만 처리합니다)
Jens Roland

7

IHMO, 다른 여러 언어 (AFAIK : Python, Java)에서와 같이 Javascript에서 오류 처리를 사용해야합니다.

가독성을 높이려면 (실제로 큰 영향을 줄지 모르겠지만 성능이 향상 될 수 있음) 다음과 같은 경우 try / catch 블록을 사용해야합니다.

  • 랩하려는 코드 부분은 전체 알고리즘 의 핵심 부분입니다 . 실패하면 다음이 가능합니다.

    • 코드의 다음 부분에 오류를 생성하십시오 (예 : var가 없기 때문에 ...)
    • 페이지가 예상 한대로 보이지 않도록 설정 (콘텐츠 또는 CSS에 미치는 영향)
    • 결과가 사용자에게 이상하게 보이도록합니다 (코드 동작에 영향을 미침)
  • 작성중인 코드 가 모든 브라우저와 호환되는 것은 아닙니다

  • if ... then ... blocks로 작동하는지 확인하는 다른 방법이 없기 때문에 코드가 실패 할 수 있다고 계획했습니다.
  • 또한 최종 사용자를 귀찮게하지 않고 디버깅 하려는 경우

결국 자바 스크립트 전문가는 다른 요소를 제공 할 수도 있습니다.

상자에 내 2 센트

문안 인사,

맥스


1
"포장하려는 코드 부분은 전체 알고리즘의 핵심 부분"입니다. 실패 처리 방법에 따라 달라질 수 있습니다. 실패했을 때 알고리즘을 계속할 수있는 방법이 없다는 것을 알고 있다면 try / catch에 모든 것을 감싸는 것이 좋습니다. . 반면에 예외에 대한 조치를 취하고 알고리즘을 계속할 수있는 경우보다 세밀한 try / catch 설정이 필요합니다.
nnnnnn

5

다른 답변 외에도 : 한 가지 중요한 것은 JavaScript 오류 객체와 함수 매개 변수 에서 사용 가능한 컨텍스트 데이터사용하는 것입니다 window.onerror.

스택 추적 (errorObject.stack), 파일 이름, 줄 번호 및 열 번호와 같은 것. 각 브라우저마다 약간의 차이가 있습니다 ... 따라서 멋진 오류가 발생하도록 최선을 다하십시오.

콘솔 개체 자체에 문제가있을 수도 있습니다 . 내가 사용 이 하나의 영감 사용자 정의 window.onerror 기능 에 의해 영감을 주어진 표준 오류 객체 추적하는 특수 기능 이 코드를 .

또 다른 좋은 점은 스택 트레이스에 가까운 곳에 웹 응용 프로그램 버전을 포함시키는 것입니다 (빠르고 안전한 복사 및 붙여 넣기). 개발자가 브라우저 콘솔을 지속적으로 모니터링하지 않고 일부 문제를 볼 수 없으므로 개발 모드에서보다 적극적으로 오류를 표시 할 수도 있습니다 (경고 ...).

또한 사용하지를 사용 throw 'My message', 사용을 throw new Error('My message')읽고, 당신도 사용자 정의 오류를 가질 수 있습니다, 이 기사를 .

항상 오류 (버전, 개체의 ID, 일부 사용자 지정 메시지 등)에 컨텍스트를 추가하고 외부 오류 (일부 외부 데이터 또는 상황이 시스템에 장애를 일으킨 경우)와 내부 오류를 구분해야합니다. / assertions (자신의 시스템이 엉망이 되었음), ' 계약 별 설계 '에 대해 읽으십시오 .

여기에 가이드가 있습니다.

또한 lib 및 프레임 워크와 같은 인터셉터와 같은 일반적인 오류 처리 사용에 대해 생각하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.