읽 기 노트 (20): 오류 처리

19981 단어 JavaScript
오류 분류
1. 문법 오류: 해석 오류 라 고도 부 릅 니 다. 전통 언어의 컴 파일 에서 발생 하고 자바 스 크 립 트 에서 해석 할 때 발생 합 니 다.이 오 류 는 코드 에 있 는 의외 의 문자 에 의 해 직접 발생 한 것 이 므 로 직접 컴 파일 / 해석 할 수 없습니다.문법 오류 가 발생 했 을 때 코드 를 계속 실행 할 수 없습니다.JavaScript 에 서 는 같은 스 레 드 에 있 는 코드 만 문법 오류 의 영향 을 받 습 니 다.다른 스 레 드 의 코드 와 다른 외부 에서 인 용 된 파일 의 코드 는 잘못된 코드 에 의존 하지 않 으 면 계속 실행 할 수 있 습 니 다.
2. 실행 중 오류: 이상 (exception, 컴 파일 기간 / 해석 기 후) 이 라 고도 합 니 다.이때 문 제 는 코드 의 문법 이 아니 라 완 성 된 조작 을 시도 하 는 것 이다. 어떤 경우 에는 불법이다.이상 은 발생 하 는 스 레 드 에 만 영향 을 주 고 다른 자 바스 크 립 트 스 레 드 는 계속 정상적으로 실 행 될 수 있 습 니 다.
오류 처리
JavaScript 는 두 가지 오 류 를 처리 하 는 방식 을 제공 합 니 다. BOM 의 onerror 이벤트 처리 함수 방식 과 ECMAScript 의 try.. catch 방식 입 니 다.
1. onerror 이벤트 처리 함수
그것 은 자바 스 크 립 트 의 오 류 를 처리 하 는 데 도움 을 주 는 첫 번 째 메커니즘 이다.페이지 에 이상 이 생 겼 을 때 error 사건 은 window 대상 에서 발생 합 니 다.예 를 들 면:
<html>

    <head>

           <title>onerror Example</title>

           <script type="text/javascript">

                  window.onerror = function() {

                        alert("");

                   }

           </script>

       </head>

       <body onload="nonExistentFunction()">

       </body>

</html>

상기 코드 에서 페이지 를 불 러 올 때 존재 하지 않 는 함 수 를 호출 하려 고 시도 하면 이상 이 발생 할 수 있 습 니 다.오류 가 발생 했 습 니 다.그러나 브 라 우 저의 오류 정보 도 보 여 줍 니 다. 브 라 우 저 에 어떻게 숨 길 수 있 습 니까? onerror 방법 으로 true 를 되 돌려 주면 됩 니 다.
<script type="text/javascript">

     window.onerror = function() {

           alert(“    !”);

           return true;

      }

</script>

1.1 오류 정보 추출
onerror 처리 함 수 는 오류 의 정확 한 성질 을 확인 하기 위해 세 가지 정 보 를 제공 합 니 다.
  i) 오류 정보 - 주어진 오류 에 대해 브 라 우 저 는 같은 정 보 를 표시 합 니 다.
  ii) URL - 어느 파일 에서 오류 가 발생 했 습 니까?
  iii) 줄 번호 - 주어진 URL 에 오류 가 발생 한 줄 번호 입 니 다.
window.onerror = function(sMessage, sUrl, iLine) {

      alert("    !
" + sMessage + "
URL:" + sUrl + "
Line Number:" + iLine); return true; }

1.2 그림 불 러 오 는 중 오류 발생
window 대상 은 onerror 이벤트 처리 함 수 를 지원 하 는 유일한 대상 이 아니 라 이미지 대상 에 도 지원 합 니 다.파일 이 존재 하지 않 는 등 이유 로 그림 을 불 러 오지 못 했 을 때 error 이벤트 가 이 그림 에서 실 행 됩 니 다.예 를 들 면:
<img src="noexist.gif" onerror="alert('         ')"/>

이전 예 는 HTML 에서 onerror 이벤트 처리 함 수 를 직접 분배 합 니 다.noexist. gif 가 존재 하지 않 기 때문에 경고 상자 가 팝 업 되 어 사용자 에 게 알려 줍 니 다.물론 스 크 립 트 를 통 해 이벤트 처리 함 수 를 할당 할 수 있 습 니 다. 그림 의 src 특성 을 설정 하기 전에 페이지 가 완전히 불 러 올 때 까지 기 다 려 야 합 니 다. 예 를 들 어:
<html>

    <head>

        <title>Image    </title>

        <script type="text/javascript">

            function handleLoad() {

                document.images[0].onerror = function() {

                    alert("");

                };



                document.images[0].src = "amigo.jpg";

            }

       </script>

   </head>

   <body onload="handleLoad()">

       <img/>

    <body>

</html>

메모: window 대상 의 onerror 이벤트 처리 함수 와 달리 image 의 onerror 사건 은 추가 정보 에 대한 인자 가 없습니다.
1.3 문법 오류 처리
onerror 이벤트 처리 함 수 는 이상 을 처리 할 수 있 을 뿐만 아니 라 문법 오류 도 처리 할 수 있 고 그것 만 처리 할 수 있 습 니 다.
우선, 이벤트 처리 함 수 는 페이지 에 첫 번 째 로 나타 나 는 코드 여야 합 니 다. 문법 오류 가 이벤트 처리 함 수 를 설정 하기 전에 나타 나 면 이벤트 처리 함수 가 소 용이 없 기 때 문 입 니 다.문법 오류 가 코드 의 실행 을 완전히 멈 출 수 있다 는 것 을 기억 하 세 요.예 를 들 면:
<html>

<head>

    <title>onError Example</title>

    <script type="text/javascript"> alert("Syntax error.";         window.onerror = function (sMessage, sUrl, iLine){

            alert("An error occurrred:
" + sMessage + "
URL:
" + sUrl + "
Line Number:
" + iLine ); return true; } </script> </head> <body onload="nonExistentFunction()"> </body> </html>

강조 되 어 있 는 줄 코드 (오류 문법 이 있 음) 가 onerror 이벤트 처리 함 수 를 할당 하기 전에 발생 했 기 때문에 브 라 우 저 는 이 오 류 를 직접 보고 합 니 다.오류 가 발생 한 후 코드 는 더 이상 설명 되 지 않 습 니 다. (이 스 레 드 가 종료 되 었 기 때문에 load 이벤트 가 해 제 될 때 호출 됩 니 다. nonExistentFunction (), 브 라 우 저 에서 도 이 오 류 를 보고 합 니 다.이 페이지 를 다시 쓰 면 onerror 이벤트 처리 함수 의 분 배 를 문법 오류 전에 두 개의 경고 상자 가 나타 납 니 다. 하 나 는 문법 오류, 다른 하 나 는 이상 을 표시 합 니 다.그러나 내 가 테스트 한 결 과 는 똑 같이 두 가지 오 류 를 보고 하고 onerror 사건 의 정 보 를 표시 하지 않 았 다.
onerror 이벤트 처리 함 수 를 사용 하 는 주요 문 제 는 BOM 의 일부분 이기 때문에 행동 을 제어 할 수 있 는 기준 이 없습니다.따라서 브 라 우 저 마다 이 사건 을 사용 하여 오 류 를 처리 하 는 방식 이 현저히 다 릅 니 다. eg. IE 에서 error 사건 이 발생 했 을 때 정상 적 인 코드 는 계속 실 행 됩 니 다. 모든 변수 와 데 이 터 를 보존 하고 onerror 사건 처리 함 수 를 통 해 접근 할 수 있 습 니 다.Mozilla 에 서 는 정상 적 인 코드 실행 이 끝나 고 모든 오류 가 발생 하기 전의 변수 와 데이터 가 삭 제 됩 니 다.
2 、 try... catch 방식
ECMPScript 3 판 은 try... catch 문 구 를 도입 했다.기본 문법 은 다음 과 같다.
try{

    //code

    [break;]

} catch ([exception]) {

    //code

    [break;]

} [finally{

    //code

}]

예 를 들 면:
try {

        window.openFile1();

        alert("    openFile1  ");

} catch (exception) {

        alert("    !");

} finally {

        alert("try..catch    !");

}

자바 와 달리 ECMAScript 표준 은 try... catch 구문 에 하나의 catch 구문 만 있 을 수 있 습 니 다. 자바 script 은 약 한 유형의 언어 이기 때문에 catch 자구 에서 이상 한 특정 유형 을 가리 킬 수 없습니다.오류 가 어떤 유형 이 든 같은 catch 구문 으로 처리 합 니 다.Mozilla 는 여러 catch 문 구 를 추가 할 수 있 도록 확장 되 었 으 나 Mozilla 만 사용 할 수 있 기 때문에 추천 하지 않 습 니 다.
finally 는 이상 이 있 든 없 든 실행 할 코드 를 포함 하 는 데 사 용 됩 니 다. 열 린 링크 를 닫 고 자원 을 방출 하 는 데 유용 합 니 다.
2.1 끼 워 넣 기 try... catch 문장
try... catch 문장의 catch 자구 에서 도 오류 가 발생 할 수 있 습 니 다.이 때, 끼 워 넣 은 try... catch 문 구 를 사용 할 수 있 습 니 다.예시:
try {

    eval("a ++ b");

} catch(oException) {

    alert("    !");

    try {

      var aError = new Array(1000000000000000000000000000000000000000);

    } catch(exception) {

        alert(" catch       !");

    }

} finally{

       alert("   ")

}

2.2 오류 대상
오류 가 발생 했 을 때 자 바스 크 립 트 에 오류 기본 클래스 가 있 습 니 다.그것 은 두 가지 특성 이 있다.
i) name - 오류 형식 을 나타 내 는 문자열
ii) message - 실제 오류 정보
Error 대상 의 name 은 클래스 에 대응 합 니 다. 다음 값 중 하나 일 수 있 습 니 다.
EvalError: 오 류 는 eval () 함수 에서 발생 합 니 다.
RangeError: 숫자 값 이 JavaScript 가 표시 할 수 있 는 범 위 를 초과 합 니 다.
Reference Error: 불법 인용 을 사 용 했 습 니 다.
SyntaxError: eval () 함수 호출 에서 문법 오류 가 발생 했 습 니 다. 다른 오 류 는 브 라 우 저 에서 보고 하고 try.. catch 를 통 해 처리 할 수 없습니다.
TypeError: 변수의 유형 은 예상 한 것 이 아 닙 니 다.
URIError: encodeURI 나 decodeURI 함수 에서 오류 가 발생 했 습 니 다.
2.3 오류 유형 판단
모든 try... catch 문 구 는 catch 자구 만 있 을 수 있 지만 던 진 오류 유형 을 판단 하 는 방법 은 주로 두 가지 가 있 습 니 다.첫 번 째 Error 대상 을 사용 하 는 name 특성:
try {

    eval("a ++ b");

} catch(oException) {

    if (oException.name = "SyntaxError") {

        alert("  SyntaxError!");

    } else {

        alert("      !");

    }

}

두 번 째 는 인 스 턴 트 오 브 연산 자 를 사용 하고 서로 다른 오 류 를 사용 합 니 다.
try {

    eval("a ++ b");

} catch(oException) {

    if (oException instanceof SyntaxError) {

        alert("  SyntaxError!");

    } else {

        alert("      !");

    }

}

2.4 이상 던 지기
ECMAScript 제3 판 에 도입 되 었 습 니 다. 목적 있 는 이상 을 던 지 는 데 사 용 됩 니 다. 잘못된 대상 은 문자열, 숫자, 불 값 또는 실제 대상 일 수도 있 고 Error 대상 을 던 질 수도 있 습 니 다. (구조 함 수 는 하나의 함수, 즉 오류 정보 만 있 습 니 다)예:
throw new Error(“    !”);

개발 자가 던 진 오류 와 브 라 우 저 자체 가 던 진 오 류 는 모두 try.. catch 에서 캡 처 되 었 습 니 다.예 를 들 면:
function addTwoNumber(a, b) {

    if (arguments.length < 2) {

        throw new Error("        !");

    }

}



try {

     result = addTwoNumber(90);

} catch(oException) {

    if (oException instanceof SyntaxError) {

         alert("SyntaxError:" + oException.message);

    } else if (oException instanceof Error){

         alert(oException.message);

    }

}

3. 디 버 깅 기술
현재 브 라 우 저 는 대부분 디 버 깅 도 구 를 가지 고 있 습 니 다. 대부분 상황 에서 충분히 사용 할 수 있 습 니 다. 또한 IE 에 서 는 IETest 도 사용 할 수 있 고 FireFox 에 서 는 FireBug 도 사용 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기