모든 자바 스크립트 처리되지 않은 예외 잡기


112

응용 프로그램에서 처리되지 않은 모든 자바 스크립트 예외를 경고 상자에 표시하는 방법을 찾거나 알아 내려고합니다. 이 모든 것이 서버 측 코드를 사용하지 않고 클라이언트 측에서 수행되기를 바랍니다. MVC3를 환경으로 사용하고 있습니다.

나는 지난 며칠 동안 조사를 해왔지만 내가 원하는 것을 정확히 찾지 못했습니다.

아래에서 두 가지 방법을 찾았는데, 거의 내가 찾고있는 것 같지만, 이러한 방법은 함수 이름을 사용자 지정 메서드에 전달하여 해당 메서드 내에서 처리되지 않은 모든 예외의 스택 추적을 인쇄해야합니다. 특정 기능. 처리되지 않은 모든 예외의 스택 추적을 인쇄하는 사용자 지정 메서드에 함수 이름을 수동으로 전달할 필요가없는 방법을 찾고 있습니다. 이 사용자 지정 메서드가 전체 응용 프로그램 내에서 처리되지 않은 모든 예외를 '듣기'를 원합니다.

http://eriwen.com/javascript/js-stack-trace/

또한 이전 링크와 유사합니다.

https://github.com/eriwen/javascript-stacktrace

다음은 지정된 자바 스크립트 함수의 스택 추적을 인쇄하는 위의 두 번째 링크의 기본 코드입니다.

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

요약하자면, 모든 자바 스크립트 처리되지 않은 예외를 수신 한 다음 경고 상자의 화면에 인쇄하는 일종의 '수신기'를 갖는 방법을 알고 있습니까?

감사! 제이슨


한 가지 .. 경고 상자를 사용 하시겠습니까?!? console.log (error_message)를 사용하여 ....
Mathlight

1
내 생각 이 질문의 모든 JS 오류가 캐치 당신을 도움이 될 것입니다
Pilgerstorfer 프란츠

이 질문을 봐야 할 것 같습니다 : stackoverflow.com/questions/205688/…
Mark

답변:


129

window.onerror 메서드를 사용하여이 작업을 수행 할 수 있습니다.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
try / catch 블록에서 전체 앱을 래핑하는 것보다 훨씬 낫습니다. :) 감사!
Anthony

15
주의 : "일부 / 다수의 오류 이벤트는 window.onerror를 트리거하지 않습니다. 특별히 들어야합니다." - developer.mozilla.org/en-US/docs/Web/API/...
shusson

6
해당 코드에 함수 이름 (myErrorHandler)을 포함 할 필요가 없습니다. 함수 (errorMsg, url, lineNumber) 일 수 있습니다.
JoelFan

18
@JoelFan 디버깅 목적으로 함수 이름을 갖는 것이 좋습니다. 디버거는 익명 함수로 표시하는 대신 함수 이름을 사용합니다.
Jerinaw

이것은 굉장하고 감사합니다! 100 % 정상적으로 작동하는 복잡한 사진 확대 스크립트를 디버깅하려고했습니다. 단, 모바일 safai에서 무작위로 실패하고 무슨 일이 일어 났는지 볼 수있는 "콘솔"또는 "개발자"창이없는 경우는 예외입니다. 물론 비밀 버튼으로 켤 수있는 자체 "디버그"창이 있지만 '시도 / 캐치'를 수행하지 않은 모든 오류를 전체적으로 볼 수있는 방법이 없었습니다. 이 추가는 문제가 정확히 어디인지 보여 주었고 더 많은 머리카락을 찢어 버리지 않았습니다! 두 번 찬성 할 수 있으면 좋겠어요!
Randy

48

를 사용 window.onerror하거나 (놀랍게도!) '오류'이벤트에 올바르게 바인딩 할 수 있습니다.

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

JavaScript 오류를 추적하려면 Atatus 를 사용해보십시오 . 저는 Atatus에서 일합니다.


7
왜 "거짓 반환"진술을합니까?
kumaresan_sd

: @kumaresan_sd 화재에 디폴트 이벤트 핸들러 수 있습니다 developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/...
옌스 Bodal

29

이외에

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

이벤트를 .then()수신 하는 promise 콜백 ( ) 내에서 발생한 모든 오류를 포착 할 수도 있습니다.unhandledrejection

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
window.onerror및을 모두 사용해야 window.addEventListener("error"합니까? 아니면 둘 중 하나만 사용하면됩니까?
Tormod Haugene 19

2
그들 중 하나를 사용할 수 있습니다. 을 사용하는 경우 버블 링되지 않은 요소 오류도 포착하기 위해 set을 로 window.addEventListener("error"전송하십시오 . developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…useCapturetrue
Javier Perez

1
감사합니다!! error이벤트 내 특정 오류를 잡는되지 않았습니다. unhandledrejection그래도 알았다.

throw new Error('tja');이 접근 방식으로 최신 크롬에 걸리지 않습니다 ...
OZZIE

1
@JavierPerez 나는 v80을 사용하여 이벤트를 첨부하고 직접 오류를 던졌고 포착되지 않았고 구문 오류도 포착하지 못했습니다.
OZZIE

1

Log4J를 기반으로 한 http://log4javascript.org를 확인하십시오 . 대부분의 코드가 예외를 처리하기 위해 try / catch 문으로 래핑 된 경우이 라이브러리를 최종 사용자가 볼 수있는 항상 사용 가능한 "대화 상자"또는 로깅 창으로 출력을 보내기위한 공통 인터페이스로 사용할 수 있습니다. window.print ()를 수행하는 버튼을 사용하여 대화 상자의 내용을 프린터 나 PDF로 인쇄 할 수도 있습니다. 행운을 빕니다.

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