목차
try catch finally 语句说明
throw语句说明
Error对象
Javascript的异常处理机制和window.onerror句柄
웹 프론트엔드 JS 튜토리얼 javascript 예외 처리 사용법_javascript 기술 요약

javascript 예외 처리 사용법_javascript 기술 요약

May 16, 2016 pm 06:51 PM
javascript 예외 처리

JavaScript中的异常可以用try..catch..finally语句来处理,也可以手动的来抛出异常。
1.使用try..catch..finally语句来处理异常
js代码在执行过程中如果出现异常,会手动创建一个异常类对象,该异常类对象将被提交给浏览器,这个过程称为“抛出异常”。当浏览器接收到一场对象时,会寻找能处理这一异常的代码并把当前异常对象提交给其处理,这一过程被称为“捕获异常”。try..catch..finally语句的基本语法格式为:

复制代码 代码如下:

try{//可能抛出异常的代码
}catch(error){//如果发生异常会执行的代码,error为发生的异常类对象
}finally{//无条件执行的代码
}

在上面的语句中,catch语句紧跟在try语句的后面,finally语句紧跟在catch的后面,这是一个完整的异常处理语句的写法。其实,catch语句和finally语句都可以省略的,但是二者至少要保留其中之一和try语句结合使用。
在try块中的语句并不一定是要抛出异常的语句,任何JavaScript语句都可以使用异常处理语句来处理,但这样做没有必要。当try块中某一行的代码抛出了异常,则该行下方的代码将不会被执行,转而直接执行catch块的代码。
在catch块中,catch语句后面括号中的error表示捕获到的异常对象实例,该实例包含异常的详细信息,可以根据这些信息作出适当的处理。如果catch语句后还有finally语句,则继续执行finally块中的语句。
finally块中的语句是始终被执行的语句,块中的语句通常做一些最后的清理工作。如果在执行finally块之前,遇到return语句、continue语句或break语句等转移流程的语句时,那么在执行这些语句前finally块中的代码也要被执行。
如果在一个异常处理语句中,只包含try..finally语句而没有补货异常的catch语句则执行try块中的语句后会直接执行finally块的语句,最后再将异常抛出。
例:
复制代码 代码如下:

<script> <br>try{ <br>var date=new Date(); <br>date.test();//调用date的未定义的test方法; <br>document.wrire("try块执行结束<br>"); <br>}catch(error){ <br>with(document){ <br>write("出现了异常<br>"); <br>write("异常类型:"+error.name+"<br>"); <br>write("异常消息:"+error.message); <br>} <br>}finally{ <br>document.write("异常处理完毕!"); <br>} <br></script>

结果:
出现了异常
异常类型:TypeError
异常消息:对象不支持此属性或方法异常处理完毕!
2.手动抛出异常
除了发生运行时浏览器会抛出异常,开发人员也可以自己动手抛出异常。手动异常抛出的语句是throw,其基本语法格式为:
throw expression;

try catch finally 语句说明

try catch finally是javascript语言提供的异常处理机制。语法结构如下

try {
 //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
로그인 후 복사
}
catch (e) {
 // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
 //e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {
로그인 후 복사
 //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
 }
로그인 후 복사

try…catch…finally…语法中除了try以外catch和finally都是可选的(两者必须要有一个),也就是说try…catch…finally…语法有以下三种形式

try{

//some code

}

catch(e){

//somecode

}

finally{

//some code

}

try{

//some code

}

catch(e){

//somecode

}

try{

//some code

}

finally{

//some code

}

如果有一定catch,一旦try中代码抛出异常以后就是先执行catch中的代码,然后执行finally中的代码。如果没有catch语句,try中的代码抛出异常后,就会先执行finally中的语句,然后将try中抛出的异常以异常的方式继续往上抛。

不管try代码块的执行时如何被终止的(出现异常、return、自然终止)finally中的语句始终会被执行,正是由于finally的这种特性,通常finally用来执行一些清理工作。如果try中代码是以return,continue,break的方式终止的,Javascript引擎会在执行完finally中的语句以后再执行相应的try中的返回语句。

throw语句说明

 throw语句在javascript1.4中已经实现。try的语法很简单,如下
로그인 후 복사
throw <tt><em>expression</em></tt>;
로그인 후 복사

其中的expression可以是任何一种类型,也就是说throw “There is a error” 或是throw 1001都是正确的。但通常我们会抛出一个Error对象或是Error对象的子类。关于Error我们稍后介绍,先看一段throw的样例代码。

function factorial(x) {
 // If the input argument is invalid, throw an exception!
 if (x < 0) throw new Error("x must not be negative");
 // Otherwise, compute a value and return normally
 for(var f = 1; x > 1; f *= x, x--) /* empty */ ;
 return f;
}
로그인 후 복사

Error对象

Error对象和它的子类是在javascript1.5中实现的。Error的构造函数有两种

new Error( )
로그인 후 복사
new Error(message )
로그인 후 복사

Error有两个基本的属性name和message。message用来表示异常的详细信息。而name指的的是Error对象的构造函数。此外,不同的js引擎对Error还各自提供了一些扩展,例如mozilla提供了fileName(异常出现的文件名称)和linenumber(异常出现的行号)的扩展,而IE提供了number(错误号)的支持。不过name和message是两个基本的属性,在firefox和ie中都能够支持。Javascript中Error还有几个子类EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError,各自的意思就不在这里详细描述了,读者可以在我提供的参考文档中找到相应的参考。

Javascript的异常处理机制和window.onerror句柄

当javascript代码中出现错误的时候,js引擎就会根据js的调用栈逐级寻找对应的catch,如果没有找到相应的catch handler或catch handler本身又有error或者又抛出新的error,最后就会把这个error的处理交给浏览器,浏览器会用各自不同的方式(IE以黄色三角图案显示在左下角,而firefix会显示在错误控制台中)显示错误信息给访问者。很多场景下,我们会觉得这种错误提示方式不够友好,而且提示信息很隐蔽,那么我们机会自定义这种错误提示的方式吗?答案是有,就是window.onerror属性。

javascript的window对象有一个特别的属性onerror,如果你将某个function赋值给window的onerror属性,那么但凡这个window中有javascript错误出现,该function都会被调用,也就是说这个function会成为这个window的错误处理句柄。

// Display error messages in a dialog box, but never more than 3
window.onerror = function(msg, url, line) {
 if (onerror.num++ < onerror.max) {
  alert("ERROR: " + msg + "\n" + url + ":" + line);
  return true;
 }
}
onerror.max = 3;
onerror.num = 0;
로그인 후 복사

onerror句柄会3个参数分别是错误信息提示,产生错误的javascript的document ulr,错误出现的行号。

onerroe句柄的返回值也很重要,如果句柄返回true,表示浏览器无需在对该错误做额外的处理,也就是说浏览器不需要再显示错误信息。而如果返回的是false,浏览器还是会提示错误信息。

window.onerror=function(){

alert(”xx”);

return true; //如果注释掉该语句,浏览器中还是会有错误提示,反之则没有。

}

function throwerror(){

throw new Error(”cc”);

}

1

我们在开发HTML的过程中避免不了一些Js的异常,通常我们也不可能依赖客户打开浏览器的错误提示框(如上图)来为我们定位bug提供线索,而利用window.onerror句柄我们就可以讲错误提示信息显示出来,客户只要在错误出现的时候,提供相应的截屏就可以了,这点可以很好的帮助开发人员定位,分析javascript相关的错误。

参考资料

Mozilla Javascript1.5核心参考

Javascript犀牛(JavaScript: The Definitive Guide)

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C++ 함수 예외 및 멀티스레딩: 동시 환경의 오류 처리 C++ 함수 예외 및 멀티스레딩: 동시 환경의 오류 처리 May 04, 2024 pm 04:42 PM

C++의 함수 예외 처리는 다중 스레드 환경에서 스레드 안전성과 데이터 무결성을 보장하는 데 특히 중요합니다. try-catch 문을 사용하면 특정 유형의 예외가 발생할 때 이를 포착하고 처리하여 프로그램 충돌이나 데이터 손상을 방지할 수 있습니다.

Java 함수의 재귀 호출과 예외 처리 간의 관계는 무엇입니까? Java 함수의 재귀 호출과 예외 처리 간의 관계는 무엇입니까? May 03, 2024 pm 06:12 PM

재귀 호출의 예외 처리: 재귀 깊이 제한: 스택 오버플로 방지. 예외 처리 사용: try-catch 문을 사용하여 예외를 처리합니다. 꼬리 재귀 최적화: 스택 오버플로를 방지합니다.

C++ 예외 처리는 사용자 정의 오류 처리 루틴을 어떻게 지원합니까? C++ 예외 처리는 사용자 정의 오류 처리 루틴을 어떻게 지원합니까? Jun 05, 2024 pm 12:13 PM

C++ 예외 처리를 사용하면 예외를 발생시키고 try-catch 블록을 사용하여 이를 잡아 런타임 오류를 처리하는 사용자 정의 오류 처리 루틴을 만들 수 있습니다. 1. 예외 클래스에서 파생된 사용자 정의 예외 클래스를 생성하고 what() 메서드를 재정의합니다. 2. 예외를 발생시키려면 throw 키워드를 사용합니다. 3. 예외를 포착하고 가능한 예외 유형을 지정합니다. 처리.

C++ Lambda 표현식에서 예외를 처리하는 방법은 무엇입니까? C++ Lambda 표현식에서 예외를 처리하는 방법은 무엇입니까? Jun 03, 2024 pm 03:01 PM

C++ Lambda 표현식의 예외 처리에는 자체 범위가 없으며 기본적으로 예외가 포착되지 않습니다. 예외를 포착하려면 Lambda 표현식 포착 구문을 사용하면 됩니다. 이 구문을 사용하면 Lambda 표현식이 정의 범위 내에서 변수를 캡처하여 try-catch 블록에서 예외를 처리할 수 있습니다.

C++ 기술의 예외 처리: 다중 스레드 환경에서 예외를 올바르게 처리하는 방법은 무엇입니까? C++ 기술의 예외 처리: 다중 스레드 환경에서 예외를 올바르게 처리하는 방법은 무엇입니까? May 09, 2024 pm 12:36 PM

다중 스레드 C++에서 예외 처리는 적시성, 스레드 안전성 및 명확성이라는 원칙을 따릅니다. 실제로는 뮤텍스 또는 원자 변수를 사용하여 예외 처리 코드의 스레드 안전성을 보장할 수 있습니다. 또한 다중 스레드 환경에서 안전하고 효율적으로 실행되도록 예외 처리 코드의 재진입, 성능 및 테스트를 고려하십시오.

PHP 예외 처리: 예외 추적을 통해 시스템 동작 이해 PHP 예외 처리: 예외 추적을 통해 시스템 동작 이해 Jun 05, 2024 pm 07:57 PM

PHP 예외 처리: 예외 추적을 통해 시스템 동작 이해 예외는 PHP에서 오류를 처리하는 데 사용하는 메커니즘이며 예외는 예외 처리기에 의해 처리됩니다. 예외 클래스 Exception은 일반적인 예외를 나타내고, Throwable 클래스는 모든 예외를 나타냅니다. throw 키워드를 사용하여 예외를 발생시키고 try...catch 문을 사용하여 예외 처리기를 정의합니다. 실제 사례에서는 예외 처리를 사용하여 오류가 발생할 때 응용 프로그램이 정상적으로 실패할 수 있도록 계산() 함수에서 발생할 수 있는 DivisionByZeroError를 캡처하고 처리합니다.

PHP에서 예외를 효과적으로 처리하는 방법 (시도, 잡기, 마지막으로, 던지기)? PHP에서 예외를 효과적으로 처리하는 방법 (시도, 잡기, 마지막으로, 던지기)? Apr 05, 2025 am 12:03 AM

PHP에서는 시도, 캐치, 마지막으로 키워드를 통해 예외 처리가 이루어집니다. 1) 시도 블록은 예외를 던질 수있는 코드를 둘러싸고 있습니다. 2) 캐치 블록은 예외를 처리합니다. 3) 마지막으로 블록은 코드가 항상 실행되도록합니다. 4) 던지기는 수동으로 예외를 제외하는 데 사용됩니다. 이러한 메커니즘은 코드의 견고성과 유지 관리를 향상시키는 데 도움이됩니다.

C++ 기술의 예외 처리: 예외 처리 성능을 최적화하는 방법은 무엇입니까? C++ 기술의 예외 처리: 예외 처리 성능을 최적화하는 방법은 무엇입니까? May 09, 2024 am 10:39 AM

C++에서 예외 처리 성능을 최적화하기 위해 다음 네 가지 기술을 구현할 수 있습니다. 불필요한 예외 발생을 방지합니다. 가벼운 예외 클래스를 사용하십시오. 효율성을 우선시하고 꼭 필요한 정보만 담은 예외 클래스를 설계하세요. 성능과 안정성의 최상의 균형을 달성하려면 컴파일러 옵션을 활용하십시오.

See all articles