有时候,在自己封装的工具函数中,如果没有传递参数或者传入了错误类型的参数,应该抛出一些错误作为警告; 当框架不正常使用时也会抛出错误。 如果你什么都不知道,就无法开始调试。 基于以上,有必要了解错误处理机制。
以下是作者的总结。 如有错误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
以上是抛出错误的构造函数的总结。 如有错误,请指正。
以上各个错误场景就不过多列举了。 如果您发现新的错误信息,请留言讨论。
相关文章:
发表评论