읽 기 노트 (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 도 사용 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.