javascript 运行时错误-JavaScript 错误处理有哪些类型?

有时候,在自己封装的工具函数中,如果没有传递参数或者传入错误类型的参数,应该抛出一些错误作为警告; 当框架不正常使用时也会抛出错误。 如果你什么都不知道,就无法开始调试。 基于以上,有必要了解错误处理机制。

以下是作者的总结。 如有错误javascript 运行时错误,请强调。

错误构造函数

javascript规范中共有8个错误的类型构造函数

其中两个有特殊说明:

EvalError是调用eval函数时出现的错误,该函数早已被弃用。 为了向后兼容,仍然可以使用较低版本。

InternalError递归太深而抛出错误,大多数浏览器都没有实现,它是一个非标准方法,在生产环境中被禁用

继承关系

Error是Error的子类,其他类型都继承Error类。 可以使用ES6中提供的Object.getPrototypeOf()来判断一个类是否继承了另一个类。

console.log(Object.getPrototypeOf(SyntaxError) === Error);    // true
console.log(Object.getPrototypeOf(TypeError) === Error);   // true
console.log(Object.getPrototypeOf(RangeError) === Error);   // true
console.log(Object.getPrototypeOf(URIError) ===  Error);   // true
console.log(Object.getPrototypeOf(EvalError) === Error);   // true
console.log(Object.getPrototypeOf(ReferenceError) === Error); // true

下面讲一下各个错误类型的使用以及出错的场景。

错误

可以通过 Error 构造函数创建错误对象。 当发生运行时错误时,会抛出 Error 实例。

句子模式:newError([message])

范围:

message 可选,错误描述信息。

抛出错误

使用 throw 子句抛出异常

throw new Error('这里抛出的是错误信息')

运行后,输出将被复制到控制台中:

Uncaught Error: 这里抛出的是错误信息

注意:使用 throw 抛出异常后,不会再执行任何代码。

捕获错误

这个错误可以通过try{}catch(){}语句捕获

try{    throw new Error('这里抛出的是错误信息')
}catch(err){
   alert(err.name + ' '+ err.message)
}

物业描述:

当使用newError创建错误实例时,会有两个属性:

let e = new Error('这里抛出的是错误信息');

name属性类型错误,此时为Error

message属性为错误信息,此时为“此处抛出错误消息”

语法错误

解析过程中出现句子错误。 这种类型抛出的错误很多,往往是由于书写中的句子错误造成的,比如:

let n = 11;   // Uncaught SyntaxError: Invalid or unexpected token
let str = "hel"lo" // Uncaught SyntaxError: Unexpected identifier
let 123Var = 'hi' // Uncaught SyntaxError: Invalid or unexpected token

句子错误很多,就不一一列举了。 在浏览器中运行时,控制台会抛出错误并告诉你是哪一行,这样使用调试器会更方便。 但需要了解错误的类型是SyntaxError,以及旁边的错误信息,这样方便纠正错误。

类型错误

不是有效类型。 这些错误给出了不需要的类型,导致操作困难,并且会抛出类型错误。

变量或参数不是预期的类型,

例如,**new**操作符后面必须跟一个函数javascript 运行时错误,如果给定的不是函数,则会抛出类型错误

let fn = 'hello';
new fn;

抛出错误:

Uncaught TypeError: fn is not a constructor

let obj = {};
obj.fn()

抛出错误:

Uncaught TypeError: obj.fn is not a function

事实上,你也可以在封装函数时强制传入参数为指定类型,否则会抛出类型错误。

function flatten(arr){    if( !Array.isArray(arr) ){        throw new TypeError('传入参数不是数组')
   }    
}
flatten('test');

当传入参数不是字段时,会抛出自定义类型错误:

Uncaught TypeError: 传入参数不是数组

参考错误

无效参考。

引用不存在的变量

console.log(a);

抛出错误

Uncaught ReferenceError: a is not defined

let str = 'hello';if( str.charAt(0) = 'h' ){
   console.log('第一个字符为h');
}

抛出错误:

Uncaught ReferenceError: Invalid left-hand side in assignment

范围误差

该值超出了有效范围。 在某些方法中,传入的值必须在一定的范围内,否则会抛出超出范围的错误。

let arr = new Array(-1)

抛出错误:

Uncaught RangeError: Invalid array length

let str = 'hello';
str.repeat(-1)

抛出错误:

Uncaught RangeError: Invalid count value

URI错误

处理 URI 编码时出错。 函数参数不正确,主要是encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数。

例如:

decodeURIComponent('%');
decodeURI('%2')

抛出错误:

Uncaught URIError: URI malformed

自定义错误类型

有时候想要自定义错误类型,就需要自定义一个构造函数,然后让原型继承Error.prototype。

function MyErrorType(message){
    this.message = message || '错误';
    this.name = 'MyErrorType';
    this.stack = (new Error()).stack;  // 错误位置和调用栈
}
MyErrorType.prototype = Object.create(Error.prototype);
MyErrorType.prototype.constructor = MyErrorType;
throw new MyErrorType('自定义错误类型抛出错误')

有关调用的错误堆栈信息

提供的错误跟踪功能、调用顺序以及在文件的哪一行捕获错误。

例如以下调用:

function trace() {
      try {
            throw new Error('myError');
      }
      catch(e) {
            console.log(e.stack);
      }
}
function b() {
    trace();
}
function a() {
    b(3, 4, 'nn', undefined, {});
}
    a('first call, firstarg');

错误信息是:

Error: myError
   at trace (:3:14)
   at b (:10:6)
   at a (:13:6)
   at :15:4

以上是抛出错误的构造函数的总结。 如有错误,请指正。

以上各个错误场景就不过多列举了。 如果您发现新的错误信息,请留言讨论。

相关文章: