JavaScript错误和异常处理


编程中存在三种错误:(a)语法错误,(b)运行时错误和(c)逻辑错误。

语法错误


语法错误,也称为解析错误发生在传统编程语言的编译时和JavaScript的解释时。

例如,以下行由于缺少右括号而导致语法错误。

<script type = "text/javascript">
    <!--
        window.print(;
    //->
</script>

当JavaScript中发生语法错误时,仅会影响与该语法错误相同的线程中包含的代码,并且假设其他线程中的其余代码均不依赖于包含该错误的代码,则其他线程中的其余代码将被执行。

运行时错误


运行时错误,也称为异常在执行期间(在编译/解释之后)发生。

例如,以下行会导致运行时错误,因为此处语法正确,但是在运行时,它正在尝试调用不存在的方法。

<script type = "text/javascript">
    <!--
        window.printme();
    //->
</script>

异常还会影响发生它们的线程,从而允许其他JavaScript线程继续正常执行。

逻辑错误


逻辑错误可能是最难追踪的错误类型。这些错误不是语法或运行时错误的结果。相反,当你在驱动脚本的逻辑中犯了一个错误而没有得到预期的结果时,它们就会发生。

你无法捕获这些错误,因为这取决于你的业务需求,你希望在程序中放入哪种类型的逻辑。

try ... catch ... finally语句


最新版本的JavaScript增加了异常处理功能。JavaScript实现了try...catch...finally结构以及throw操作符来处理异常。

你可以捕捉程序员产生的和运行时的异常,但你不能捕捉JavaScript的语法错误。

下面是try...catch...finally块的语法:

<script type = "text/javascript">
    <!--
        try {
            //要运行的代码
            [break;]
        }
      
        catch ( e ) {
            //发生异常时运行的代码
            [break;]
        }
      
        [ finally {
            //始终执行的代码,无论
            //发生异常
        }]
    //->
</script>

try块后面必须有一个catch块或者一个finally块(或者两者之一)。当一个异常在try块中发生时,该异常被放在e中,然后执行catch块。可选的final块在try/catch之后无条件地执行。

例子

这是一个示例,其中我们试图调用一个不存在的函数,而这又引发了一个异常。让我们看看它的表现如何try...catch

<html>
    <head>
        <script type = "text/javascript">
            <!--
                function myFunc() {
                    var a = 100;
                    alert("Value of variable a is : " + a );
                }
            //->
        </script>
    </head>
   
    <body>
        <p>Click the following to see the result:</p>
      
        <form>
            <input type = "button" value = "Click Me" onclick = "myFunc();" />
        </form>
    </body>
</html>

现在让我们尝试使用try...catch并显示一条用户友好的消息。如果要向用户隐藏此错误,也可以禁止显示此消息。

<html>
    <head>
      
        <script type = "text/javascript">
            <!--
                function myFunc() {
                    var a = 100;
                    try {
                        alert("Value of variable a is : " + a );
                    }
                    catch ( e ) {
                        alert("Error: " + e.description );
                    }
                }
            //->
        </script>
      
    </head>
    <body>
        <p>Click the following to see the result:</p>
      
        <form>
            <input type = "button" value = "Click Me" onclick = "myFunc();" />
        </form>
      
    </body>
</html>

你可以使用finally在try / catch之后将始终无条件执行的代码块。这是一个例子。

<html>
    <head>
      
        <script type = "text/javascript">
            <!--
                function myFunc() {
                    var a = 100;
               
                    try {
                        alert("Value of variable a is : " + a );
                    }
                    catch ( e ) {
                        alert("Error: " + e.description );
                    }
                    finally {
                        alert("Finally block will always execute!" );
                    }
                }
            //->
        </script>
      
    </head>
    <body>
        <p>Click the following to see the result:</p>
      
        <form>
            <input type = "button" value = "Click Me" onclick = "myFunc();" />
        </form>
      
    </body>
</html>

抛出异常


你可以使用throw引发内部异常或自定义异常的语句。以后可以捕获这些异常,你可以采取适当的措施。

以下示例演示了如何使用throw语句。

<html>
    <head>
      
        <script type = "text/javascript">
            <!--
                function myFunc() {
                    var a = 100;
                    var b = 0;
               
                    try {
                        if ( b == 0 ) {
                            throw( "Divide by zero error." );
                        } else {
                            var c = a / b;
                        }
                    }
                    catch ( e ) {
                        alert("Error: " + e );
                    }
                }
            //->
        </script>
      
    </head>
    <body>
        <p>Click the following to see the result:</p>
      
        <form>
            <input type = "button" value = "Click Me" onclick = "myFunc();" />
        </form>
      
    </body>
</html>

你可以使用字符串,整数,布尔值或对象在一个函数中引发异常,然后可以使用与上述相同的函数或使用试着抓block.

onerror()方法


onerror事件处理程序是促进JavaScript中错误处理的第一个功能。这error只要页面上发生异常,就会在窗口对象上触发事件。

<html>
    <head>
      
        <script type = "text/javascript">
            <!--
                window.onerror = function () {
                    alert("An error occurred.");
                }
            //->
        </script>
      
    </head>
    <body>
        <p>Click the following to see the result:</p>
      
        <form>
            <input type = "button" value = "Click Me" onclick = "myFunc();" />
        </form>
      
    </body>
</html>

onerror事件处理程序提供三条信息,以识别错误的确切性质:

  • 错误信息:对于给定的错误,浏览器将显示相同的消息;

  • URL:发生错误的文件;

  • 行号:给定URL中导致错误的行号。

这是显示如何提取此信息的示例。

<html>
    <head>
   
        <script type = "text/javascript">
            <!--
                window.onerror = function (msg, url, line) {
                    alert("Message : " + msg );
                    alert("url : " + url );
                    alert("Line number : " + line );
                }
            //->
        </script>
      
    </head>
    <body>
        <p>Click the following to see the result:</p>
      
        <form>
            <input type = "button" value = "Click Me" onclick = "myFunc();" />
        </form>
      
    </body>
</html>

你可以以你认为更好的任何方式显示提取的信息。

你可以使用onerror方法,如下所示,以在加载图像时出现任何问题时显示错误消息。

<img src="myimage.gif" onerror="alert('An error occurred loading the image.')" />

你可以使用onerror带有许多HTML标签,以在发生错误时显示适当的消息。