zoukankan      html  css  js  c++  java
  • js中异常处理


    //js中定义了错误处理机制(throw、 try...catch,以及创建用户定义错误类型的能力)

    //js中的异常处理语句有两个,一个是try……catch……,一个是throw。
    // try……catch用于语法错误,错误有name和message两个属性。
    // throw用于逻辑错误。
    // 对于逻辑错误,js是不会抛出异常的,也就是说,用try catch没有用。这种时候,需要自己创建error对象的实例,然后用throw抛出异常。

    // 注意:通过Error的构造器可以创建一个错误对象。当运行时错误产生时,Error的实例对象会被抛出。
    // Error对象也可用于用户自定义的异常的基础对象;
    // js中的Error类型共分为七种,分别为:
    //1、 Error 构造函数,以下六种类型均继承于它,常规类型。
    //2、 EvalError 创建一个error实例,表示错误的原因:与 eval() 有关。 eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。
    //3、 InternalError 创建一个代表Javascript引擎内部错误的异常抛出的实例。 如: "递归太多".严格模式中不建议使用;
    //4、 RangeError 创建一个error实例,表示错误的原因:数值变量或参数超出其有效范围。
    //5、 ReferenceError 创建一个error实例,表示错误的原因:无效引用。
    //6、 SyntaxError 创建一个error实例,表示错误的原因:eval()在解析代码的过程中发生的语法错误。
    //7、 TypeError 创建一个error实例,表示错误的原因:变量或参数不属于有效类型。
    //8、 URIError 创建一个error实例,表示错误的原因:给 encodeURI()或 decodeURl()传递的参数无效。

    /*1、throw语句 */

    //throw语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止;
    //一般情况,不同的错误,处理方式不一样。可以参考下面的处理方式。
    try {
    someFunction();
    } catch (error){
    if (error instanceof TypeError){
    //处理ૌ类型错误
    } else if (error instanceof ReferenceError){
    //处理引用错误
    } else {
    //处理其他的错误
    }
    }
    //抛出异常
    throw e;
    //抛出用于自定义的异常
    throw 'error';
    throw '21';
    throw true;
    throw new myError();

    //重新抛出异常
    //你可以使用throw来抛出异常。下面的例子捕捉了一个异常值为数字的异常,并在其值大于50后重新抛出异常。重新抛出的异常传播到闭包函数或顶层,以便用户看到它。
    var n = 55;
    try {
    throw n; // 抛出一个数值异常
    } catch (e) {
    if (e <= 50) {
    // 异常在 1-50 之间时,直接处理
    } else {
    // 异常无法处理,重新抛出
    throw e; //55
    }
    }

    /* 2、try{}catch{} 语句 */

    //try语句包含了由一个或者多个语句组成的try块, 和至少一个catch块或者一个finally块的其中一个,或者两个兼有, 下面是三种形式的try声明:
    // 1、try...catch
    // 2、try...finally
    // 3、try...catch...finally

    /*该函数接收一个数字,返回他的平方。*/
    function foo(num) {
    if(typeof num == "number"){
    return num * num;
    }else{
    throw new TypeError("类型错误,你应该传入一个数字...")
    }
    }
    console.log(foo(33))
    console.log(foo("abc")) //类型错误,你应该传入一个数字...


    //1、无条件的catch块
    //当使用单个无条件catch子句时,抛出的任何异常时都会进入到catch块。例如,当在下面的代码中发生异常时,控制转移到catch子句
    try {
    throw "myException"
    } catch (error) {
    logMyErrors(error) //Uncaught ReferenceError: logMyErrors is not defined
    }

    //2、条件catch块
    //注意:非标准:该特性是非标准的,请尽量不要在生产环境中使用它!
    // 你也可以用一个或者更多条件catch子句来处理特定的异常。在这种情况下,当异常抛出时将会进入合适的catch子句中。在下面的代码中,try块的代码可能会抛出三种异常:TypeError,RangeError和EvalError。当一个异常抛出时,控制将会进入与其对应的catch语句。如果这个异常不是特定的,那么控制将转移到无条件catch子句。

    // 当用一个无条件catch子句和一个或多个条件语句时,无条件catch子句必须放在最后。否则当到达条件语句之前所有的异常将会被非条件语句拦截。

    // 提醒:这个功能不符合 ECMAscript 规范。
    try {
    myroutine(); // may throw three types of exceptions
    } catch (e if e instanceof TypeError) {
    // statements to handle TypeError exceptions
    } catch (e if e instanceof RangeError) {
    // statements to handle RangeError exceptions
    } catch (e if e instanceof EvalError) {
    // statements to handle EvalError exceptions
    } catch (e) {
    // statements to handle any unspecified exceptions
    logMyErrors(e); // pass exception object to error handler
    }

    //下面用符合 ECMAscript 规范的简单的 JavaScript 来编写相同的“条件catch子句”(显然更加冗长的,但是可以在任何地方运行):
    try {
    myRoutine();
    } catch (e) {
    if (e instanceof RangeError) {
    // statements to handle this very common expected error
    } else {
    throw e; // re-throw the error unchanged
    }
    }

    //3、finally块
    //finally块包含的语句在try块和catch之后,try..catch..finally块后的语句之前执行。
    //请注意,无论是否抛出异常finally子句都会执行。此外,如果抛出异常,即使没有catch子句处理异常,finally子句中的语句也会执行。

    //以下示例打开一个文件,然后执行使用该文件的语句(服务器端 JavaScript 允许您访问文件)。
    //如果文件打开时抛出异常,则finally子句会在脚本失败之前关闭该文件。finally中的代码最终也会在try或catch block显式返回时执行。

    openMyFile()
    try {
    // tie up a resource
    writeMyFile(theData);
    }
    finally {
    closeMyFile(); // always close the resource
    }

    // 示例
    // 嵌套 try 块
    // 首先让我们看看这里发生什么:

    try {
    try {
    throw new Error("oops");
    }
    finally {
    console.log("finally");
    }
    }
    catch (ex) {
    console.error("outer", ex.message);
    }

    // Output:
    // "finally"
    // "outer" "oops"
    //现在,如果我们已经在 try 语句中,通过增加一个 catch 语句块捕获了异常

    try {
    try {
    throw new Error("oops");
    }
    catch (ex) {
    console.error("inner", ex.message);
    }
    finally {
    console.log("finally");
    }
    }
    catch (ex) {
    console.error("outer", ex.message);
    }

    // Output:
    // "inner" "oops"
    // "finally"
    //现在,让我们再次抛出错误。

    try {
    try {
    throw new Error("oops");
    }
    catch (ex) {
    console.error("inner", ex.message);
    throw ex;
    }
    finally {
    console.log("finally");
    }
    }
    catch (ex) {
    console.error("outer", ex.message);
    }

    // Output:
    // "inner" "oops"
    // "finally"
    // "outer" "oops"
    //任何给定的异常只会被离它最近的封闭 catch 块捕获一次。当然,在“inner”块抛出的任何新异常
    //(因为 catch 块里的代码也可以抛出异常),将会被“outer”块所捕获。

    // 从 finally 语句块返回
    // 如果从finally块中返回一个值,那么这个值将会成为整个try-catch-finally的返回值,无论是否有return语句在try和catch中。
    // 这包括在catch块里抛出的异常。

    try {
    try {
    throw new Error("oops");
    }
    catch (ex) {
    console.error("inner", ex.message);
    throw ex;
    }
    finally {
    console.log("finally");
    return;
    }
    }
    catch (ex) {
    console.error("outer", ex.message);
    }

    // 注: 此 try catch 语句需要在 function 中运行才能作为函数的返回值, 否则直接运行会报语法错误
    // Output:
    // "inner" "oops"
    // "finally"
    //因为 finally 块里的 return 语句,"oops" 没有抛出到外层,从 catch 块返回的值同样适用。
  • 相关阅读:
    小朋友的责任 转自点妈文集
    amazon.cn, 感觉不错
    团队作业1——团队展示&选题
    如何解决mysql中的账户添加后不能登录的问题
    目标检测中常见指标
    latex知识点
    考研复试建议
    论文写作经验
    Git
    Python编程知识
  • 原文地址:https://www.cnblogs.com/fmixue/p/13523604.html
Copyright © 2011-2022 走看看