JavaScript高级之自定义异常

目录
  • 1.概念
    • 1.1什么是错误与异常
    • 1.2异常的分类
  • 2.异常处理
    • 2.1try...catch语句
    • 2.2finally语句
    • 2.3throw语句
  • 3.Error对象
    • 3.1自定义异常类型

前言:

在我们的实际编程中,抛出异常(代码报错)是最正常不过的,但是怎么处理异常这就要因人而异的,有的人遇到异常,通常会通过某种办法解决这个异常或者将其隐藏;但是在JavaScript中提供了一套完整的处理异常的机制,使程序遇到异常还可以正确的执行。所以说异常处理的在实际应用的重要性是毋庸置疑的,一个完整的Web应用肯定有一套完整的异常处理机制。

这篇文章我们来介绍一下JavaScript处理

1.概念

1.1什么是错误与异常

所谓的错误就是编程的过程中使程序不能正常运行的状态,也称为异常。

JavaScript中所有的异常都是Error对象,遇到异常就会抛出一个Error对象,这个对象中包含错误的描述信息。

通过JavaScript提供的异常处理语句,我们可以用结构化的方式来捕捉发生的错误,让异常处理代码与核心业务代码实现分离。

1.2异常的分类

在实际的开发中,异常可以主要分为以下三种:

  • 逻辑错误:逻辑错误是最难被追踪的错误类型。这些错误是由于程序运行的逻辑上出现错误,从而导致你的脚本程序并不能得到你想要的结果。
  • JavaScript自带错误:这是最为常见的错误类型,例如发生JavaScript的语法错误、代码引用错误、类型错误等,JavaScript的引擎都会自动触发这些错误。
  • 开发者主动抛出的错误:一般都是开发者为了满足自己的需求所定义出的错误

2.异常处理

2.1try...catch语句

try...catch语句是JavaScript中处理异常的一种标准方式,语法结构如下所示:

try {
     // 供测试的代码块
}
 catch(err) {
     // 处理错误的代码块
}

参数:

  • try:语句允许您定义一个代码块,以便在执行时检测错误。
  • catch:语句允许你定义一个要执行的代码块,如果try代码块中发生错误将会执行此代码块
  • err:一个标识符,此标识符表示一个Error对象,错误的类型与测试代码块中的错误与之对应。

示例代码如下所示:

try {
  // 用于测试有没有出错的代码块
  console.log(v) // 此时v没有定义将会抛出异常
} catch (error) {
  // 抛出异常将执行此代码块
  console.log('上述代码有错误')
}

值得注意的是**try和catch**语句是成对出现的

2.2finally语句

finally语句又称为终结块,此语句块会在trycatch语句结束之后执行,无论结果是否报错。

语法结构如下所示:

try {
     // 供测试的代码块
}
 catch(err) {
     // 处理错误的代码块
}
finally {
     // 无论 try  catch 结果如何都执行的代码块
}

示例代码如下所示:

// var v
try {
  // 用于测试有没有出错的代码块
  console.log(v) // 此时v没有定义将会抛出异常
} catch (error) {
  // 抛出异常将执行此代码块
  console.log('上述代码有错误')
} finally {
  console.log('我必须被执行')
}

2.3throw语句

throw****语句用来抛出一个用户自定义的异常。此异常可以是任何数据类型。当执行throw语句时,当前执行将会被停止,如果有catch块,则会执行catch块,否则将跳出循环。

语法格式如下:

throw expression;

expression:要抛出的表达式

使用throw语句来抛出一个异常。当你抛出异常时,expression指定了异常的内容。

示例代码如下所示:

// throw "错误"  // 输出 错误
throw false   // 输出 false

当然,throw后面也可以是一个对象

3.Error对象

通过Error的构造器可以创建一个错误对象。当运行时错误产生时,Error的实例对象会被抛出。一般情况下Error类型的错误很少见,基本都是其他错误类型的,但是其他错误类型都是继承于Error的。

Error对象主要用于用户自定义的异常的基础对象。

除了Error对象外,JavaScript还提供了如下几种预定义类型的错误

错误名 描述
EvalError 已在eval()函数中发生的错误
RangeError 已发生超出数字范围的错误
ReferenceError 已发生非法引用
SyntaxError 已发生语法错误
TypeError 已发生类型错误
URIError 在encodeURI()中已发生的错误

Error的属性主要有如下两个:

属性 描述
name 设置或返回错误名
message 设置或返回错误消息(一条字符串)

创建Error对象的实例语法格式如下所示:

new Error([message)

参数:

message:可选,描述的错误信息

其他预定义类型的创建语法与Error相同

3.1自定义异常类型

如果JavaScript提供的异常类型不能够满足我们,我们可以自定义属于自己的异常类型,这个自定义的异常类型一般都是继承Error的异常类型,而且可以通过instanceof关键字来表示属于那种异常类型。

先来看一下Node.js中提供的用于自定义异常类型所提供的属性和方法,

如下所示:

error.stack:属性:返回一个字符串,字符串的第一行会被格式化为<error class name>: <error message>,且带上一系列栈帧(每一行都以"at "开头)。每一帧描述了一个代码中导致错误生成的调用点。
Error.captureStackTrace(targetObject[, constructorOpt])方法:targetObject表示一个对象,constructorOpt表示对象的构造函数。作用:在targetObject上创建一个.stack属性

示例代码如下:

function MyError(message) {
  this.message = message
  this.name = 'MyError'
  /*
   * Error.captureStackTrace(targetObject[, constructorOpt])
   * 参数 targetObject -> 表示一个对象
   * 参数 constructorOpt -> 表示对象的构造函数
   * 在targetObject上创建一个.stack属性, 调用是返回一个调用 Error.captureStackTrace() 的位置的字符串。
   */
  Error.captureStackTrace(this, MyError)
}

MyError.prototype = new Error()
MyError.prototype.constructor = MyError

// * 在node.js 环境中 new Error 会直接抛出异常 不适用于 node.js环境
// function MyError(message) {
//   this.name = 'MyError';
//   this.message = message || 'Default Message';
//   this.stack = (new Error()).stack;
// }
// MyError.prototype = Object.create(Error.prototype);
// MyError.prototype.constructor = MyError;

try {
  throw new MyError('错了')
} catch (e) {
  console.log(e)
}

结语:

JavaScript 中的异常处理,在实际的开发中一般只做两件事情:

  • 将异常改为提示信息
  • 将异常输出到异常日志中查看错误信息。

到此这篇关于JavaScript高级之自定义异常的文章就介绍到这了,更多相关JavaScript自定义异常内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springboot2.0处理自定义异常并返回json

    这篇文章主要介绍了Springboot2.0处理自定义异常并返回json,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 编写自定义异常类 package cn.jfjb.crud.exception; /** * @author john * @date 2019/11/24 - 9:48 */ public class UserNotExistException extends RuntimeException { public Use

  • Java构造方法 super 及自定义异常throw合集详解用法

    1.构造方法: public 类名(){} 区别一下 // public void 方法名(){} 分为有参,无参子类构造方法 public class Zi extends fu{ public int message=35; public Zi(){ System.out.println("我是谁"); }} 创建对象时:就会输出:子类构造方法中内容: 2.super和this使用: public void show(int message) { System.out.printl

  • JavaScript高级之自定义异常

    目录 1.概念 1.1什么是错误与异常 1.2异常的分类 2.异常处理 2.1try...catch语句 2.2finally语句 2.3throw语句 3.Error对象 3.1自定义异常类型 前言: 在我们的实际编程中,抛出异常(代码报错)是最正常不过的,但是怎么处理异常这就要因人而异的,有的人遇到异常,通常会通过某种办法解决这个异常或者将其隐藏:但是在JavaScript中提供了一套完整的处理异常的机制,使程序遇到异常还可以正确的执行.所以说异常处理的在实际应用的重要性是毋庸置疑的,一个完

  • javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)

    关于javascript中类的继承可以参考阮一峰的Blog<Javascript继承机制的设计思想>,说的很透. 一.在javascript中实例化遇到的问题: 下面用<javascript高级程序设计>中的例子来做说明,假如现在定义了一个car的对象,它是Object类的实例.像下面这样的: 复制代码 代码如下: var oCar=new Object(); oCar.color = "red"; oCar.doors = 4; oCar.mpg = 23;

  • JavaScript高级程序设计(第3版)学习笔记6 初识js对象

    在房子里面可以放你想放的任意事物--如果你有足够的美学造诣,你甚至可以弄一个房中房试试--当然,为了方便管理,我们会给房子里存放的所有事物都会取上一个不重复的名字,比如医药房间里的各种药品名称.在ECMAScript中,你可以在对象中存放任意你想放的数据,同样,我们需要给存放的数据取一个名字--也就是对象的属性名,再存放各种数据.再看看ECMA-262中对象的定义:无序属性的集合,其属性可以包含简单数据类型值.对象或者函数. 进入对象,我开始有些激动了,说实话,让我想起做这系列学习笔记的最初原因

  • JavaScript高级程序设计(第3版)学习笔记 概述

    在JavaScript面世之初,没有人会想到它会被应用的如此广泛,也远比一般人想象中的要复杂强大的多,在我自己学习的过程中,曾经有过多次震撼,只是常常没有过多久,很多美轮美奂的用法就又模糊起来,希望通过对JavaScript高级程序设计(第3版)的专题学习笔记,能够较为系统的将基础知识梳理一次,也能够将自己平常学习与工作过程中遇到的一些美妙用法记录下来,便于自己再次学习,当然,也希望可以给有需要的朋友们一些力所能及的帮助. 相关术语 先简要说一下和JavaScript相关的一些背景术语,就不详细

  • JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型

    ECMAScript是一种动态类型的语言,构建于5种简单数据类型(Undefined.Null.Boolean.Number.String)和一种复杂数据类型(Object)的基础之上.这篇文章就来复习一下简单数据类型,我会尽量从编程实践的角度来描述,下面代码运行环境为FireFox 14.0.1. 简单数据类型 简单数据类型 取值 Undefined undefined(只有一个值) Null null(只有一个值) Boolean true|false(只有两个值) Number 数值 St

  • JavaScript高级程序设计(第三版)学习笔记1~5章

    第2章,在html中使用JavaScript Html引入外部js脚本 <script type="text/javascript" src="test.js">两个</script>之间不应放脚本,因为并不会被执行</script> <script>标签有一个defer属性可以延迟脚本执行,但是并不保证会按脚本排列顺序执行 建议:将脚本引入放在<body>标签的所有内容之后,而不放在<head>

  • javascript高级选择器querySelector和querySelectorAll全面解析

    querySelector 和 querySelectorAll 方法是 W3C Selectors API 规范中定义的.他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素. 目前几乎主流浏览器均支持了他们.包括 IE8(含) 以上版本. Firefox. Chrome.Safari.Opera. querySelector 和 querySelectorAll 在规范中定义了如下接口: module dom { [Supplemental, NoInterfaceObject] i

  • javascript高级程序设计(第三版)学习笔记(一) 正则表达式整理

    1.创建正则表达式 第一种方式:注意这里的正则表达式不能使用单引号或者双引号,如下 var pattern1 = /[abc]/i; // 匹配第一个"a"或"b"或"c",不区分大小写 第二种方式:使用RegExp构造函数创建,该构造函数传入两个参数,都是字符串,所以需要特别注意"\"符号的转换,所有元字符(下面有讲元字符)需要双重转义,如下 复制代码 代码如下: var patt1 = new RegExp("[

  • JavaScript高级程序设计(第3版)学习笔记8 js函数(中)

    6.执行环境和作用域 (1)执行环境(execution context):所有的JavaScript代码都运行在一个执行环境中,当控制权转移至JavaScript的可执行代码时,就进入了一个执行环境.活动的执行环境从逻辑上形成了一个栈,全局执行环境永远是这个栈的栈底元素,栈顶元素就是当前正在运行的执行环境.每一个函数都有自己的执行环境,当执行流进入一个函数时,会将这个函数的执行环境压入栈顶,函数执行完之后再将这个执行环境弹出,控制权返回给之前的执行环境. (2)变量对象(variable ob

  • 《JavaScript高级编程》学习笔记之object和array引用类型

    本文给大家分享我的javascript高级编程学习笔记之object和array引用类型,涉及到javascript引用类型相关知识,大家一起看看把. 1. Object类型 大多数引用类型值都是Object类型的实例:而且Object也是ECMAScript中使用最多的一个类型. 创建Object实例有如下两种方式: new操作符后跟Object构造函数: var person=new Object( ); person.name="webb"; person.age=25; 对象字

随机推荐