2013-10-17 2 views
4

많은 자바 스크립트 라이브러리와 프레임 워크는 일부 작업이 완료된 후에 호출되는 함수를 허용합니다. 예를 들면 :javascript : 콜백에서 예외를 억제하는 libs를 사용하는 방법?

chrome.storage.local.get('foo', function() { console.log("foo"); }); 

하지만 난 단지 등 일부 API 용의가, 캐치 위에서 언급 한 로컬 스토리지 API를 구글과 기능의 모든 예외가 호출되고 억제 것을 깨달았다. 나는 (내가 콘솔에 표시 할 ReferenceError) 오류가 위 코드를 수정하는 경우 예를 들어, : 오류가 API부터 제기되지 않습니다

chrome.storage.local.get('foo', function() { a.b(); }); 

을 잡기 및 모든 오류를 무시하여 억제. 이러한 상황에서 내 코드를 디버깅하는 방법? 오류를 다시 가져 오는 방법이 있습니까? 아니면이 모든 API는 복잡한 코드와 함께 사용하기위한 것이 아니며 무엇이 실패했는지 수동으로 console.log을 통해 디버깅해야합니까?

UPDATE

1 간단히 정말 환영하지 않는 코드의 복잡성을 추가 모든 콜백 내 자신의 시도 - 캐치를 추가. 또한, 간단한 console.log 예외가 dev 도구에 의해 캐치되어 빨간색으로 표시되고, 스택 추적이 첨부되어 있기 때문에 더 나쁩니다. 물론 이것은 모두 console.log으로 에뮬레이트 될 수 있지만 더 복잡해집니다.

업데이트 2

는 오류를 무시하는 JS 코드에 대한 ommon 연습 것 같다, 그래서 내가 밑줄 플러그인을 추가하고 각 콜백 봉투이를 사용하여 추한 솔루션을 구현하도록 강요했다 :

function _safeblock(block) 
{ 
    console.assert(block); 
    return function() { 
    try { 
     block.apply(this, arguments); 
    } 
    catch(e) { 
     console.log(e.message, e.stack); 
    } 
    }; 
} 


function _safecall(block) 
{ 
    console.assert(block); 
    _safeblock(block)(); 
} 


_.mixin({ 
    safeblock: _safeblock, 
    safecall: _safecall, 
}); 
+1

이 문제를 해결하기 위해 무엇을 했습니까? –

+0

@BenjaminGruenbaum 각 타사 콜백을 안전 코드로 묶어 추악한 솔루션을 구현했습니다. 그러나 이는 단지 일시적인 해킹 일 뿐이며 적절한 아키텍처 솔루션이 아닙니다. – grigoryvp

답변

3

직접 잡을 수 있습니다.

chrome.storage.local.get('foo', function() { 
    try{ 
     a.b(); 
    }catch(e){ 
     console.log(e); 
     //do whatever 
    } 
}); 

당신은 storage.local.get를 재정 의하여 또는 일반적인 기능 래퍼를 작성하여 중,이 문제를 자동화 할 수 있습니다.

당신은 또한 당신의 오류를 억제하기 위해 라이브러리에 대한 것이 불가능 (브라우저에서) 할 것이다 수동의 setTimeout과 기능을 연기 할 수

chrome.storage.local.get('foo', function() { 
    setTimeout(function(){ 
      a.b(); 
    }); 
}); 

이렇게하면 외부 (아무것도하지만 매우 의미있는 스택 추적을주지 못할 것이다 함수가 표시되지 않습니다). 퍼포먼스에 민감한 상황에서도 이것을 사용하면 퍼포먼스 오버 헤드가 발생할 가능성이있다. (브라우저에서 setTimeout은 적어도 몇 밀리 초가 걸린다. postMessage 해킹이있다.)

+0

모든 API 호출에서 ALL 콜백을 보호하면 코드 복잡성이 추가됩니다. – grigoryvp

+1

당신 말이 맞아요.모든 API 메소드를 프록시하거나 모든 API 호출을 시도하거나 catch해야합니다. API에 대한 래퍼를 작성하십시오. 모든 예외를 억제하는 것은 API IMO에서 잘못된 디자인 호출입니다. 특히 "디버그 모드"와 같은 것을 제공하지 않는 경우에 특히 그렇습니다. JS 이외의 다른 언어에서도 마찬가지입니다. –

2

당신은 단순히 시도 - 캐치를 수행하고 console.error (다른 사람에 대해 확실하지 방화범과 크롬 DevTools로의 작품) 사용할 수 있습니다 : 당신이 당신의 콜백 인수가 필요하지 않은 경우

chrome.storage.local.get('foo', function() 
{ try { a.b(); } 
    catch (e) { console.error(e.name + ": " + e.message); } 
}); 

을, 당신은 만들 수 있습니다 래퍼 함수 :

function wrapTryCatch(func) 
{ return function() 
    { try { func.apply(this, arguments); } 
     catch (e) 
     { var err = e.name + ': ' + e.message; 
      console.error ? console.error(err) 
      : console.log ? console.log(err) 
      : alert(err); 
     } 
    } 
} 
+0

모든 API 호출에서 ALL 콜백을 보호하면 코드 복잡성이 추가됩니다. – grigoryvp

+0

@ EyeofHell : 그것은 꼭 필요한 악은 아닌 것 같지만 좀 더 연구 할 것입니다. –

+0

나는 그것이 악하다고 말하는 것이 아니며 내가 더 좋은 것을 찾지 않는 한이 접근법을 사용할 것입니다. 하지만 명확한 이유없이 코드에 복잡성을 추가하는 것을 좋아하지 않습니다. 어쩌면이 문제는 잘 알려져 있으며 Google 크롬 또는 글로벌 자바 설정의 숨겨진 스위치와 같은 것이므로 정상적으로 작동합니다. – grigoryvp

관련 문제