2012-01-24 2 views
14

JavaScript를 배우기 시작 했으므로 아무런 문제가 없지만 JS의 Exception 메커니즘에 대한 좋은 설명을 찾는 데 어려움이 있습니다.다른 유형의 예외를 어떻게 구분할 수 있습니까?

JS는 C++과 비슷하게 보입니다. JS는 단지 Exception 객체를 던지기보다는 (모든 객체를 동적 인 특성 때문에) 모든 객체를 던질 수 있습니다.

throw 'An error occured.'; 

작품뿐만 아니라

throw new Exception('An error occured.'); 

catchfinally 모두 같은 자신의 자바 상당처럼 작동하는 것 같다. 그래도 예외에 대해 널리 인정되는 모범 사례가 무엇인지는 알 수 없습니다.

throw 'An error occured'; 

가 어떻게 예외의 다른 유형을 구분합니다 :

그래서, 예를 들어, 같은 문자열 형식의 개체를 던져 합법적인가?

+0

질문의 범위를 좁혀 야합니다. 어떤면에서 모범 사례? –

답변

12

예외를 던지고 잡는 것은 꽤 비쌉니다. 자바 스크립트에서는 형식이 잘못된 JSON 문자열을 구문 분석하려는 경우 예외가 발생합니다. try/catch를 피하고 대신 C++보다 예외 발생 가능성이 적기 때문에 구식 방식 (반환 유형, 변수를 사용하기 전에 변수가 올바르게 초기화되었는지 확인하는 등)에 대해 확인하는 데 초점을 둡니다. 또는 특히 자바 또는 .NET.

Andy E's recommendation은 실제로이를 처리하는 데 적합하지만 일반적으로 try/catch가 필요 없도록 방어적인 방식으로 JavaScript 코드를 작성해야합니다. 자바 (가장 빠른 엔진)의 JITed JavaScript조차 자바 나 C#과 비교하여 여전히 느리기 때문에 C++에 대해 아무 말도하지 않기 때문에 이러한 언어로 비용이 많이 드는 것은 자바 스크립트에서 더욱 그렇습니다.

+0

+1, 거의 쓰지 않아도 try/catch 문에 대해 권장하지 않습니다. try/catch가 필요한 이유 중 하나는 존재하지 않거나 인스턴스화 할 수없는 호스트 객체 (예 : IE의 'ActiveXObjects')를 처리 할 때입니다. –

15

"최선의 방법"은 예외를 일으키는 문제와 관련된 올바른 유형의 Error 개체를 던지는 것입니다. ECMAScript는 여러 유형의 예외 객체를 정의하며이 객체는 모두 Error에서 상속받습니다. 이러한 개체는 EvalError, RangeError, ReferenceError, TypeErrorURIError입니다. 를 포함한 여러 가지 이유로 나에게 가난한 연습 파업 예외 객체를 사용하지 않고 throw 문을 사용하여, 일반적으로

try { 
    // do something 
} 
catch (e) { 
    if (e instanceof TypeError) { 
     // do something else 
    } 
} 

:

그 생성자

당신이 이런 일을 수행 할 수있는 기본 인 ECMAScript 함수가 사용된다 : 예외 예기치 않은 부작용이없이 수정 또는 예외를 처리 할 수없는 결과를 초래할 수 프리미티브를 Error 객체를 기다리고 수신 될 수 처리하도록 설계

  • 코드 처리 코드. 예를 들어 throw 표현식의 결과에 stack 속성이 없다는 것입니다.
  • try/catch 문에서 사용하지 않으면 Internet Explorer 8 이하가 "예외가 발생하여 걸리지 않았습니다"*과 같은 메시지와 함께 다른 예외가 throw됩니다. 개발자 도구를 사용하여 디버깅을하거나 전역 예외 처리기를 window.onerror으로 설정하면 훨씬 더 혼란 스러울 수 있습니다.

예, 일반적으로 적절하게 인스턴스 Error 또는 그 상속 대상을 던지십시오.

* nb, IE는 Error에서 직접 생성되지 않은 Error 개체 유형에도이 작업을 수행합니다. 예, 바보 같아요.하지만 IE 9에서는 "설계 상"이라고 말했지만 해결했습니다.

+6

'throw '은 단지'catch'에서 반환 된 에러가'Error' 인스턴스가 아니고 순수 RAGE 인 경우'.stack' 속성을 가지고 있지 않기 때문에 안티 패턴입니다. 제쳐두고 try/catch/throw는 JS의 일반적인 성능 방지 패턴이므로 가능하면 피해야합니다. – Raynos

2

AJAX 앱을 만드는 경우 예외가별로 유용하지 않을 수 있습니다.위의 코드에서

function save_data(){ 
    try { 
     ajax(some_ulr, function(){ 
      //callback 
      do_wrong_thing(); 
     }); 
    } catch(e){ 
     handler_error(); 
    } 
} 

을 기대할 수 있기 때문에 AJAX 작업의 비동기 특성으로, 오류 처리, 캐치 부분을 트리거하지 않습니다 do_wrong_thing으로 인한 오류를 작동하지 않습니다.

+2

비동기 코드도 예상대로 작동해야하므로 'return'이 나옵니다. – hugomg

관련 문제