zoukankan      html  css  js  c++  java
  • 使用 try-catch

    ECMA-262 第 3 版引入了 try-catch 语旬,当 try-catch 语句中发生错误时, 浏览器会认为错误已经被处理了 ,因而不会报告错误。对于那些不要求用户懂技术,也不需要用户理解错误的 Web 应用程序,这应该说是个理想的结果。不过try-catch 能够让我们实现自己的错误处理机制。使用 try-catch 最适合处理那些无法控制的错误。假设在使用一个大型 JavaScript 库中的函数,该函 数可能会有意无意地抛出一些错误,由于我们不能修改这个库的源代码,所以大可将对该函数的调用放在try-catch语句当中,万一有什么错误发生,也好恰当地处理它们。 在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不太合适了。例如,如果传递给函数的参数是字符串而非数值,就会造成函数出错,那么就应该先检查参数的类型,然后再决定如何去做。在这种情况下,不应使用try-catch语句。作为 JavaScript 处理异常的一种标准方式。基本语法如下:

    try { 
        //可能会导致错误的代码 
    } catch(error) { 
        //在错误发生时怎么处理
    }

     用户应把所有可能会抛出错误的代码都放在 try 语句块中,而把那些用于错误处理的代码放在 catch 块中。 

    try { 
        a+b; 
    } catch (error) { 
        alert ("非法的变量");
    }

    如果 try 块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行 catch 块。此时, catch 块会接收到一个包含错误信息的对象。与在其他语言中不同的是,即使不使用这个错误对象,也要给它起个名字。错误对象中包含的实际信息会因浏览器而异,但都有一个保存着错误消息的 message 属性。 ECMA-262 还规定了一个保存错误类型的 name 属性,当前所有浏览器都支持这个属性(Opera 9 之前的版本不支持这个属性〉。因此,在发生错误时,就可以像下面这样实事求是地显示浏览器给出的消息。

    //这个例子在向用户显示错误消息时,使用了错误对象的 message和name 属性。
    try { 
        a+b; 
    } catch (error) { 
        alert(error.message);      //错误信息
        alert(error.name);         //错误类型
    }

    使用 finally

    finally 子旬在 try-catch 语句中是可选的,但如果 finally 子句已经使用, 则其代码无论如何都会执行。 无论try或 catch 语句块中包含什么代码一一甚至 return 语句,都不会阻止 finally 子句的执行。只要代码中包含 finally 子旬,那么无论try还是 catch 语句块中的 return 语句都将被忽略。 因此,在使用 finally 子句之前,一定要非常清楚想让代码怎么样。看下面这个函数。 

    //如果提供 finally 子句,则 catch 子句就成了可选的,IE7 及更早版本中有一个bug: 除非有 catch 子句,否则 finally 中的代码永远不会执行。如果考虑兼容 IE 早期版本,应提供一个 catch 子句,哪怕里面什么都不写, IE8 修复 了这个 bug。
    function test() {
        try{ 
            return 2; 
        } catch (error) { 
            return l; 
        } finally { 
            return 0;
        }
    }

    这个函数在位 try-catch 语句的每一部分都放了一条 return 语句。表面上看,调用这个函数会返回 2, 因为返回 2 的 return 语句位于try语句块中,而执行该语句又不会出错。可是,由于最后还有一个 finally 子句,结果就会导致该 return 语句被忽略, 也就是说,调用这个函数只能返回 0。 如果把自finally子句去掉,这个函数将返回 2。

    使用 throw

    与问 try-catch 语句相配的还有一个 throw 操作符,用于随时抛出自定义错误。抛出错误时,必须要给 throw 操作符指定一个值,这个值是什么类型没有要求。 在遇到由 throw 操作符时,代码会立即停止执行。 仅当有 try-catch 语句捕获到被抛出的值时,代码才会继续执行。

    //下列代码都是有效的。
    throw 1; 
    throw "hi";
    throw true;
    throw {name: "js"}; 

    通过使用某种内置错误类型,可以更真实地模拟浏览器错误。每种错误类型的构造函数接收一个参数,即实际的错误消息。 

    throw new Error ("抛出错误");
    throw new SyntaxError("SyntaxError");
    throw new TypeError("TypeError");
    throw new RangeError("RangeError");
    throw new EvalError("EvalError");
    throw new URLError("URLError");
    throw new ReferenceError("ReferenceError");
    function process(values) { 
        if (!(values instanceof Array)) { 
            throw new Error("process():参数必须为数组。");
        }
        values.sort();
        for (var i=0, len=values.length; i<len; i++) { 
           if (values[i] > 100) { 
                return values[i];
           }
        }
        return -1;
    }

    错误事件

    任何没有通过句 try-catch 处理的错误都会触发 window 对象的 error 事件。这个事件是浏览器最早支持的事件之一IE、 Firefox 和 Chrome 为保持向后兼容,并没有对这个事件作任何修改, Opera 和 Safari 不支持 error 事件。 在任何 Web 浏览器中, onerror 事件处理程序都不会创建 event 对象,但它可以接收 3 个参数:

    window.onerror = function(message,url,line){ 
        alert(message);     //错误信息
        alert(url);         //错误地址
        alert(line);        //错误行号
        return false;       //在事件处理程序中返回 false,可以阻止浏览器报告错误的默认行为。
    }

    通过返回 false,这个函数实际上就充当了整个文档中的 try-catch 语旬,可以捕获所有无代码处理的运行时错误。这个事件处理程序是避免浏览器报告错误的最后一道防线,理想情况下,只要可能就不应该使用它。只要能够适当地使用 try-catch 语句,就不会有错误交给浏览器,也就不会触发 error 事件。

  • 相关阅读:
    Ubuntu 更换软件源
    Ubuntu 配置 SOCKS5
    Ubuntu 配置 Sha-dow-socks
    frp(内网穿透)
    solr 远程代码执行(CVE-2019-12409)
    多线程处理爬虫
    python实现文件自动排序
    python 实现根据文件名自动分类移动至不同的文件夹
    Centos7如何开启任意端口服务
    centos7默认安装没有连接网络
  • 原文地址:https://www.cnblogs.com/lanshu123/p/10422847.html
Copyright © 2011-2022 走看看