1.Error()构造函数

javascript解析或执行语句时,一旦发生错误,js引擎会将其抛出!

JavaScript原生提供了Error()构造函数,所有抛出的错误都是这个构造函数的实例(即对象)。

 var err1=new Error('shows error');
console.log(err1);
console.log(err1.message);

运行结果:

err1是由Error()构造函数产生的一个实例对象;对象中有所有javascript引擎都提供的message属性

当代码运行或解析发生错误时,js引擎会抛出错误,程序中断在错误发生的地方,不再往下执行!

有些js引擎还提供错误对象的namestack属性。但是记住它们不是标准的,不一定每个js引擎均提供!

  • message:错误提示信息
  • name:错误名称(非标准属性)
  • stack:错误的堆栈(非标准属性)
 var err2=new Error('this is error 2');
console.log(err2.message);//this is error 2
console.log(err2.name);//Error
console.log(err2.stack);//Error: this is error 2 at 7.js:5

运行结果:

2.javascript原生错误构造函数

除了Error(),js还定义了6个更详细的构造函数

  1. SyntaxError():语法错误
  2. ReferenceError():引用错误
  3. RangeError():超出有效范围错误
  4. TypeError():类型错误
  5. URIError():URI错误
  6. EvalError():eval函数没有被正确执行错误。注意:该构造函数在ES5中不再出现,现在有些地方依然保留,只是为了兼容性!
 var err3=new Error('出错了');
var err4=new SyntaxError('语法错误');
var err5=new ReferenceError('引用错误');
var err6=new RangeError('范围超出错误');
var err7=new TypeError('类型错误');
var err8=new URIError('URI错误');
var err9=new EvalError('eval函数使用错误');
console.log(err3,err4,err5,err6,err7,err8,err9);
console.log(typeof Error,typeof SyntaxError);//function function

运行结果:

3.自定义错误对象(除javascript中内建的7种构造函数创建错误对象)

 function ErrorA(message){
this.message= message || '错误';
this.name='ErrorA';
}
//使ErrorA继承Error
ErrorA.prototype=new Error();
ErrorA.prototype.constructor=ErrorA; var err10=new ErrorA('产生了ErrorA错误对象');
console.log(err10);

运行结果:

4.throw语句:接收一个表达式作为参数,抛出错误或意外,中断程序执行

常用用法如:throw new Error('此处出错');

 var a=100;
console.log(a);
throw new Error('error shows');//程序中断在这里,不会往下执行
console.log(1000);//程序执行不到这里

运行结果:

模拟一下console对象的assert方法:即传入的参数不是正确的表达式,就抛出错误

 console.log('---');
function assert(expression,message){
if(!expression){
throw {name:'Assert function',meaage:message};
}
}
assert(100,'error shows 1');//此时没出错
assert(undefined,'error shows 2');//此时出错

运行结果:

使用console.assert():

5.try...catch语句:对错误进行处理;结构有try,一般就要有catch。finnally不必须!

当try中抛出一个错误,程序立马跳转到catch中执行。

如下示例:try中抛出多个错误,但只有第一个错误被捕获!

 console.log('---');
try{
throw new TypeError('类型错误');//跳转到catch中进行捕获
throw new RangeError('范围超出错误');//不会执行
}catch(e){
console.log(e);
}finally{
console.log('finnally');
}

运行结果:

相应的,在catch中还可以嵌套语句(如:try...catch)

 console.log('---');
try{
throw new TypeError('类型错误');//跳转到catch中进行捕获
throw new RangeError('范围超出错误');//不会执行
}catch(e){
if(e instanceof RangeError){
console.log(e);
}else{
//嵌套了try...catch语句
try{
throw e;
}catch(e){
if(e instanceof TypeError){
console.log('嵌套');
console.log(e.message);
}else{
throw e;//如果还不符合条件,继续抛出,可以继续进行嵌套
}
}
} }finally{
console.log('finnally');
}

运行结果:

注意:try...catch语句处理不当,容易造成结构化编程原则的破坏谨慎使用!!!

如果catch中有return,注意执行结果:

 console.log('---');
var a=10;
function test(){
try{
throw a;
return a+'1';//+'1'分辨出从哪里返回的值
}catch(e){
return a;//在finally执行之前已经将返回值保存下来了,执行完finnally后,立即返回保存的值
}finally{
a+=10;
}
}
console.log(test());//
console.log(a);//

运行结果:

参考:阮一峰JavaScript标准参考教程

最新文章

  1. sqlserver 性能优化常用方法
  2. java学习笔记(菜鸟原创)
  3. QRCode.js 生成二维码
  4. Android 隐藏Fragment
  5. 重设mysql的root密码,MAC OSX
  6. C# Socket 入门4 UPD 发送结构体(转)
  7. 各种实用的js,bootstrap插件
  8. [MFC美化] SkinMagic使用详解3- 常见使用问题解答
  9. C#开发移动应用系列(1.环境搭建)
  10. keras04 GAN simple
  11. ArcGis地理坐标系转投影坐标系问题的思考与处理
  12. 统计不同渠道的的UV,再合计渠道总计UV
  13. codeforces 2A Winner (好好学习英语)
  14. 如何安装和配置RabbitMQ
  15. request接受表单数据中文乱码问题分析
  16. PHP利用memcache缓存技术提高响应速度
  17. Android之利用JSBridge库实现Html,JavaScript与Android的所有交互
  18. 给力分享新的ORM => Dapper( 转)
  19. bilibili携手WeTest,保障视频类应用优质适配体验
  20. 如何读取xml文件,根据xml节点属性查询并输出xml文件

热门文章

  1. Chromimu与JS交互的测试
  2. day2_jmeter断言
  3. Android SDK 环境变量
  4. unity 2d游戏 按y坐标排序子对象
  5. python摸爬滚打之day09----初识函数
  6. java 选择排序、冒泡排序、折半查找
  7. [转载]智能科普:VR、AR、MR的区别
  8. 数据库机器迁移对AlwaysON 集群影响测试
  9. 数据库---初识sql语句
  10. Win版:Adobe 全系列软件模拟授权注册破解工具 AMT Emulator V0.9.2