Javascript学习之错误处理


throw语句

使用throw语句抛出一个异常。当抛出异常,规定一个含有值的表达式要被抛出。可以抛出任意表达式而不是特定一种类型的表达式。

throw expression;

示例:

function UserException(excMessage) {
    this.excMessage = excMessage;
    this.excName = "UserException";
}
UserException.prototype.toString = function () {
    return this.excName + ":" + this.excMessage;
}

throw new UserException("this is an exception!!!");


throw "Error2";   // String type
throw 42;         // Number type
throw true;       // Boolean type
throw {message: function() { return "1111111111"; } };

在抛出异常时声明一个对象,就可以在catch块中查询到对象的属性。

try...catch语句

try...catch 语句标记一块待尝试的语句,并规定一个以上的响应应该有一个异常被抛出。如果我们抛出一个异常,try...catch语句就捕获它。

try...catch 语句有一个包含一条或者多条语句的try代码块,0个或1个的catch代码块,catch代码块中的语句会在try代码块中抛出异常时执行。

如果try代码块中的语句(或者try 代码块中调用的方法)一旦抛出了异常,那么执行流程会立即进入catch 代码块。如果try代码块没有抛出异常,catch代码块就会被跳过。

finally 代码块总会紧跟在try和catch代码块之后执行,但会在try和catch代码块之后的其他代码之前执行。

finally块无论是否抛出异常都会执行。如果抛出了一个异常,就算没有异常处理,finally块里的语句也会执行。

示例:

function getMonthName(mon) {
    let months = ["Jan","Feb","Mar","Apr","May","Jun","Jul",
                  "Aug","Sep","Oct","Nov","Dec"];
    if (months.includes(mon)) {
      return mon;
    } else {
      throw "InvalidMonthNo";
    }
}
  
try {
    let monthName = getMonthName("Mayyyy");
    console.log(monthName);
}catch (e) {
    console.log("exception:" + e);
}finally{
    console.log("excute finally!!");
}