Error,Error,到底什么是Error

简介: 总所周知,当系统运行出现错误的时候,就会抛出一个 Error ,那么这个 Error 是什么?它是怎么来的?它又是怎么被抛出的?它又是怎么被捕获的?这些问题,我们一起来探讨一下。

总所周知,当系统运行出现错误的时候,就会抛出一个Error,那么这个Error是什么?它是怎么来的?它又是怎么被抛出的?它又是怎么被捕获的?这些问题,我们一起来探讨一下。

1. Error

Error是一个对象,它是浏览器提供的一个内置对象,它的实例属性主要有:

  • name:错误的名称,比如TypeErrorReferenceError
  • message:错误的描述信息
  • cause:错误的原因
  • stack:错误的堆栈信息,非标准属性
  • fileName:错误发生的文件名,非标准属性,Mozilla提供
  • lineNumber:错误发生的行号,非标准属性,Mozilla提供
  • columnNumber:错误发生的列号,非标准属性,Mozilla提供
  • line:错误发生的行的内容,非标准属性,Mozilla提供

静态属性:

  • Error.captureStackTrace:捕获错误的堆栈信息,非标准属性,V8提供
  • Error.stackTraceLimit:设置错误堆栈信息的最大长度,非标准属性,V8提供

静态方法:

  • Error.captureStackTrace():捕获错误的堆栈信息,非标准方法,V8提供
  • Error.prepareStackTrace():格式化错误堆栈
  • Error.stackTraceLimit:设置错误堆栈信息的最大长度,非标准方法,V8提供

实例方法:

  • error.toString():返回错误的字符串表示,覆盖了Object.prototype.toString()方法

2. Error的创建

Error对象是通过new关键字来创建的,它的构造函数有三种形式:

  • new Error(message)
  • new Error(message, { cause })
  • new Error(message, fileName, lineNumber)

其中,message是错误的描述信息,cause是错误的原因,它们都是可选的。

目前只有messagecause两个参数是确定的;

name属性是不确定的,它的值取决于错误的类型,比如TypeErrorReferenceError等;

stack属性也是不确定的,它的值取决于错误的堆栈信息。

其他的属性,比如fileNamelineNumbercolumnNumberline等,他们是由Mozilla提供的,它们的值取决于浏览器的实现。

3. Error的抛出

Error对象是通过throw关键字来抛出的,它的抛出形式有两种:

  • throw new Error()
  • throw 'error message'

第一种形式是抛出一个Error对象,第二种形式是抛出一个字符串,它们的区别是:

* 第一种形式抛出的是一个`Error`对象,它拥有`error`对象的所有属性和方法,比如`name`,`message`,`stack`等;
* 第二种形式抛出的是一个字符串,它只有`message`属性,没有`name`属性,也没有`stack`属性。

通常情况下,我们都是抛出一个Error对象,而不是抛出一个字符串。

4. Error的捕获

Error对象是通过try...catch关键字来捕获的,它的捕获形式有两种:

  • try...catch
  • try...catch...finally
try {
   
  // ...
} catch (error) {
   
  // ...
} finally {
   
  // ...
}

关于catch语句可以省略遗产捕获的参数,或者不写catch,但是并不是所有的浏览器都支持,比如IE浏览器就不支持。

try {
   
    // ...
} catch {
   
    // ...
} finally {
   
    // ...
}

try {
   
    // ...
} finally {
   
    // ...
}

5. 自定义Error

es6之前,Error如果要实现自定义的错误,只能通过prototype来实现,比如:

function MyError(message, fileName, lineNumber) {
   
    var instance = new Error(message, fileName, lineNumber);
    Object.setPrototypeOf(instance, CustomError.prototype);
    if (Error.captureStackTrace) {
   
        Error.captureStackTrace(instance, CustomError);
    }
    return instance;
}

Object.setPrototypeOf(MyError.prototype, Error.prototype);

Object.setPrototypeOf(MyError, Error);

MyError.prototype.name = 'MyError';

try {
   
    throw new MyError('error message');
} catch(e) {
   
    console.error(e.name); // MyError
    console.error(e.message); // error message
}

es6之后,Error可以通过class来实现自定义的错误,比如:

class MyError extends Error {
   
    constructor(message) {
   
        super(message);
        this.name = 'MyError';

        if (Error.captureStackTrace) {
   
            Error.captureStackTrace(this, MyError);
        }
    }
}

try {
   
    throw new MyError('baz', 'error message');
} catch(e) {
   
    console.error(e.name); // MyError
    console.error(e.message); // error message
}

6. 浏览器内置的Error

在浏览器的Error类型中,Error是一个基类,它的子类有EvalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError等。

try {
   
    throw new EvalError('error message');
} catch(e) {
   
    console.error(e.name); // EvalError
    console.error(e.message); // error message
}

它们都是继承自Error的,所以它们都拥有Error的所有属性和方法,它们之间的区别是,在不同的情况下,会抛出不同的错误。

它们并没有太多区别,只是用于提示用户在不同的情况下,用于描述错误的信息,使用户更好的理解错误的原因。

本质上它们都是Error的子类,所以它们都可以通过instanceof来判断,比如:

try {
   
    throw new EvalError('error message');
} catch(e) {
   
    console.error(e instanceof Error); // true
    console.error(e instanceof EvalError); // true
}

结语

ErrorJavaScript中非常重要的一个类型,它用于描述错误的信息,使用户更好的理解错误的原因,同时也是开发者非常头疼的一个类型,愿开发的过程中无Error

目录
相关文章
|
2月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
SQL 存储 数据采集
数据中台建设方法论
数据中台建设方法论
|
弹性计算 安全 网络安全
阿里云服务器租用流程,四种阿里云服务器租用方式图文教程参考
阿里云服务器可以通过自定义租用、一键租用、云市场租用和活动租用四种方式去租用,不同的租用方式适合不同的用户群体,例如我们只是想租用一款配置较低且可以快速部署应用的云服务器,通常可以选择一键租用或者云市场租用,本文为大家展示不同租用方式的适合对象以及租用流程,以供初次租用阿里云服务器的用户参考和选择。下面是阿里云服务器租用的图文操作步骤。
11752 2
|
机器学习/深度学习 传感器 监控
深度学习在图像识别中的突破与应用
随着人工智能的飞速发展,深度学习已经成为推动图像识别技术进步的核心动力。本文旨在探讨深度学习在图像识别领域的最新突破及其广泛应用,通过分析卷积神经网络(CNN)等关键技术的发展,揭示深度学习如何革新传统图像处理方式,提升识别精度和效率。文章还将概述当前面临的挑战与未来发展趋势,为读者提供一个全面而深入的技术视角。
|
移动开发 JavaScript 前端开发
ThreeJs简介
这篇文章介绍了Three.js的基础知识,包括其相对于WebGL的优势以及如何使用Three.js创建基本的3D场景。
649 1
蜂窝网络下行链路的覆盖率和速率性能matlab仿真分析
此程序在MATLAB2022a环境下运行,基于随机几何模型评估蜂窝网络的下行链路覆盖率和速率性能。通过模拟不同场景下的基站(BS)配置与噪声情况,计算并绘制了各种条件下的信号干扰加噪声比(SINR)阈值与覆盖率概率的关系图。结果显示,在考虑噪声和不同基站分布模型时,覆盖率有显著差异,提出的随机模型相较于传统网格模型更为保守但也更加贴合实际基站的分布情况。
|
弹性计算 Ubuntu Linux
阿里云服务器“镜像”怎么选择?看这一篇文章就够了!
阿里云服务器镜像是服务器的“装机盘”,用于安装操作系统、初始化数据和预装软件。阿里云提供五种镜像类型:公共镜像(官方提供,正版授权)、自定义镜像(用户创建)、共享镜像(其他账户共享)、云市场镜像(官方或第三方发布)。选择镜像需考虑应用需求,如程序语言、服务器配置等。推荐Linux用户选择Alibaba Cloud Linux,Windows用户选择Windows Server 2022数据中心版。中国大陆地域的服务器支持免费无限次更换操作系统,而海外地域服务器更换系统有限制。Alibaba Cloud Linux是由阿里云官方推出并深度优化的Linux发行版,兼容RHEL/CentOS生态,
5978 1
|
关系型数据库 MySQL 索引
mysql索引失效的原因以及解决办法
该内容列举了索引失效的五个原因,包括:条件表达式中的函数使用、不等于操作符、列类型不匹配、LIKE操作的模糊匹配和数据量过小。并提供了对应的解决办法:避免函数操作索引列、使用合适条件、保证类型匹配、选择合适索引、优化表结构和使用索引提示。
1174 1
|
人工智能
全方位解析PAI:数据准备、模型开发、模型训练一网打尽
全方位解析PAI:数据准备、模型开发、模型训练一网打尽 随着人工智能技术的飞速发展,越来越多的企业开始关注并投入到AI的研发中。然而,AI的研发并非易事,从数据准备、模型开发、模型训练到模型服务,每一个环节都需要专业的工具和平台来支持。阿里云的PAI(Powered by AI)正是一个涵盖了数据准备、模型开发、模型训练、模型服务全流程的AI工作平台。本文将为您详细介绍PAI的各个子产品的产品线上规格及使用指引。
484 2
|
编解码 Python
python怎么提取视频中的音频
python怎么提取视频中的音频
633 0