2011-02-10 3 views
0

내 브라우저 쪽 JavaScript 코드에 모든 오류를 기록하고 싶습니다. 나는 여기에 대해 많은 토론을 보았고 window.onerror에 관해서 그물을 보았다. 그리고 그것이 브라우저 간 상호 작용을하지 않는다는 것이 분명하다. 그래서 try-catch로 최상위 엔트리 함수를 래핑 할 계획입니다. 문제는 많은 코드가 이벤트 핸들러입니다. 아직 테스트하지는 않았지만 이벤트 처리기 함수가 정의 된 위치에 관계없이 던져진 오류는 코드를 선언하는 이벤트 함수가 아니라 브라우저를 호출하는 브라우저 구현에 직접 실행됩니다. 내 유일한 선택은 가장 작은 익명의 오류 처리기라도 모든 오류 처리기에서 throw, catch 및 오류 로그 호출을 선언하는 것입니다. 나는 그다지 좋아하지 않는다.이벤트 처리기에 대한 전역 오류 로깅 javascript

가능한 솔루션 :

내가 브라우저 등록 이벤트를 건너 하나의 방법을 사용합니다. 나는 이런 식으로 뭔가를 수정할 수 있습니다 :

function registerEventHandler(object, handlerRef) { 
    var wrapperFunction = function(evt) { 
    try {   
    handlerRef(evt); 
    } catch { 
    logError(error); 
    } 
    registerEvent(object, wrapperFunction); 
} 

그 구현 한 가지 중요한 문제가 있습니다. 나중에 이벤트 핸들러 함수에 대한 참조를 유지하여 나중에 등록 취소합니다. 핸들러가 원래 래퍼가 아닌 래퍼가 될 것이므로이 기능은 작동하지 않습니다. 이에 대한 해답은 랩퍼 -> 랩핑 된 맵핑 오브젝트를 구현하여 등록 해제시이를 사용하는 것입니다.

질문 :

내가 감히 마술사보다 더 영리한 해결책을 제공하는 자바 스크립트. 어쩌면 등록 전에 이벤트 핸들러 함수를 어떻게해서든지 늘릴 수 있습니다. 이것은 나의 JavaScript 지식만큼 멀리이다. 네 것은 어때?

답변

1

나는 종종 나중에 등록을 취소 하기 위해 이벤트 핸들러 함수에 대한 참조를 유지한다. 이것은 핸들러가 핸들러로 등록 된 함수로 작동하지 않으므로 래퍼가됩니다. 원래는 이 아닙니다.

왜 이것이 문제입니까? 일단 함수가 에러 핸들링에 싸여지면, 원래 함수에 대해 더 이상 신경 쓰지 않습니다. 래퍼는 원래 함수에 대한 참조를 유지하고 래퍼는 등록 된 것이며 래퍼는 등록을 취소해야합니다.

생성하는 래퍼 함수에 대한 참조를 유지하십시오. 유일한 래퍼 함수이므로 중요합니다.


또한 그것의 자신의 기능

var protectErrors = function(fn) { 
    var that = this; 
    return function() { 
    try { 
     fn.apply(that, arguments); 
    } catch(error) { 
     logError(error); 
    } 
    }; 
}; 

var registerEventHandler = function(object, handlerRef) { 
    var wrapperFunction = protectErrors(handlerRef); 
    registerEvent(object, wrapperFunction); 
}; 

protectErrors(fn) 그것에서 호출 된 문맥에 상관없이 원본을 실행하는 기능을 반환이 패턴이 훨씬 더 재사용 할 것이다 제작 및 인수를 무제한으로 전달 .

+0

큰 문제는 아닙니다. Squeegy, 오버 헤드가 많습니다. 나는 그것을 원할 수 없다. 나는 그것을 도울 수있다. –

+0

+1 protectErrors의 경우, 감사합니다;) –

+0

(좀 더 일반적인'protectErrors'를 만들기위한 사소한 업데이트, btw). 글쎄, 오버 헤드만큼 전역 오류 처리를 사용할 수 없다면, 유일한 선택은 지역 시도 잡기입니다. 그걸 해결할 방법이 아니야. –

관련 문제