try、catch、finally
- try语句测试代码块错误
- catch语句处理错误
- finally语句在try和catch之后,无论是否有异常都会执行
try{
... //异常的抛出
}catch(e){
... //异常的捕获与处理}
finally{
... //结束处理
}
特点
- try和catch成对出现
- 只会检测语法错误
- 只会检测同步运行的错误
finally
一定会执行的代码
- try块中有error,在catch后执行finally
- try块中有return,优先执行finally再return
- 可以try…finallly,也可以try…catch…finally
- try块中声明的let,finally中不能用(try块和finally块是独立的)
throw
定义:自定义错误,术语为抛出异常throw exception
异常可以是js字符串、数字、逻辑值、对象,但是最好使用具有name和message属性的对象 保持和内置error的兼容性
let json = '{ "age": 30 }'; // 不完整的数据
try {
let user = JSON.parse(json);
if (!user.name) {
throw new SyntaxError("数据不全:没有 name"); //抛出
}
alert( user.name );
} catch(err) {
alert( "JSON Error: " + err.message ); // JSON Error: 数据不全:没有 name
}
error构造器
- Error
- SyntaxError
- ReferenceError
- TypeError等
- 对于内建的 error对象,name 属性刚好就是构造器的名字。message 则来自于参数(argument)。
let error = new Error(message);
let error = new SyntaxError(message);
let error = new ReferenceError(message);
自定义error
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = "ValidationError";
}
}
function test() {
throw new ValidationError("Whoops!");
}
try {
test();
} catch(err) {
alert(err.message); // Whoops!
alert(err.name); // ValidationError
alert(err.stack); // 一个嵌套调用的列表,每个调用都有对应的行号
}
再次抛出
代码中不一定只有一个error,确保catch只处理知道的error并抛出其他所有error
function readData() {
let json = '{ "age": 30 }';
try {
// ...
fn(); // error!
} catch (err) {
// ...
// 类型判断 将未知error再次抛出
if (!(err instanceof SyntaxError)) {
throw err;
}
}
}
//在外部统一处理所有未知eoor
try {
readData();
} catch (err) {
alert( "External catch got: " + err ); // 捕获
}
全局catch
在try…catch语法外的error,会触发
window.onerror = function(message, url, line, col, error) {
// ...
};
- message:error 信息。
- url:发生 error 的脚本的 URL。
- line,col:发生 error 处的代码的行号和列号。
- error:error 对象。