zoukankan      html  css  js  c++  java
  • JavaScript高级程序设计:第十七章

    错误处理与调试

    一、错误处理

    1.try-catch语句:

             ECMA-262第3版引入了try-catch语句,作为javascript中处理异常的一种标准方式。基本的语法如下:

             try {

                      //可能会导致错误的代码

             } catch(error){

                      //在错误发生时怎么处理

             }

    也就是说,我们应该把所有可能会抛出错误的代码放在try语句块中,而把那些用于错误处理的代码放在catch块中。例如:

             try {

                      window.someNonexistentFunction( ) ;

             } catch (error) {

                      alert( “ An error happened! ” ) ;

             }

             如果try块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着catch块。此时,catch块会接收到一个包含错误信息的对象。

    (1)finally子句

             虽然在try-catch语句中是可选的,但finally子句一经使用,其代码无论如何都会执行。换句话说,try语句块中的代码全部正常执行,finally子句会执行;如果因为出错而执行了catch语句块,finally子句照样还会执行。只要代码中包含finally子句,则无论try或catch语句块中包含什么代码——甚至return语句,都不会阻止finally子句的执行。来看下面的函数:

             function  testFinally( ) {

                      try {

                              return 2;

                      } catch (error) {

                              return 1 ;

                      } finally {

                              return 0 ;

                      }

             }

    (2)错误类型

             执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象。

             Error

             EvalError              (在使用eval()函数发生异常时被抛出)

             RangeError     (类型的错误会在数值超出相应范围时触发)

             ReferenceError  (找不到对象的情况下)

             SyntaxError     (把语法错误的javascript字符串传入eval()函数时,就会导致错误)

             TypeError      (在变量中保存着意外的类型或者访问不存在的方法时会导致错误)

             URIError            (使用encodeURI()或decodeURI(),而URI格式不正确时)

             其中,Error是基类型,其他错误类型都继承自该类型。

    (3)合理使用try-catch

             使用try-catch最适合处理那些我们无法控制的错误。在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不太合适了。

    2.抛出错误

             与try-catch语句相匹配的还有一个throw操作符,用于随时抛出自定义错误。抛出错误时,必须要给throw操作符指定一个值,这个值是什么类型,没有要求。以下代码都是有效的:

             throw  123456 ;

             throw  “Hello world!” ;

             throw  true ;

             throw  { name :“javascript”} ;

             在遇到throw操作符时,代码会立即停止执行。仅当try-catch语句捕获到被抛出的值时,代码才会继续执行。

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

             throw  new  Error(“Something  bad  happened.”);

    3.错误事件

             任何没有通过try-catch处理的错误都会触发window对象的error事件。onerror事件处理程序不会创建event对象,但是它可以接收三个参数:错误消息、错误所在的URL和行号。

    4.常见的错误类型

    (1)类型转换错误

             类型转换错误发生在使用某个操作符,或者使用其他可能会自动转换值的数据类型的语言结构时。在使用相等(==)和不相等(!=)操作符,或者在if、for及while等流控制语句中使用非布尔值时,最常发生类型转换错误。多数情况下,建议使用全等(===)和不全等(!==)操作符,避免类型转换错误。

    (2)数据类型错误

             为了保证不会发生数据类型错误,只依靠开发人员编写适当的数据类型检测代码。在预料之外的值传递给函数的情况下,最容易发生数据类型错误。

    (3)通信错误

             第一种通信错误与格式不正确的URL或发送的数据有关。最常见的问题是在将数据发送给服务器之前,没有使用encodeRUIComponent( )对数据进行编码。另外,服务器响应的数据不正确时,也会发生通信错误。

    5.区别致命错误和非致命错误

             任何错误处理策略中最重要的一个部分,就是确定错误是否致命。对于非致命错误,可以根据下列一个或多个条件来确定:

             不影响用户的主要任务

             只影响页面的一部分

             可以恢复

             重复相同操作可以消除错误

    致命错误,可以通过下列一个或多个条件来确定:

             应用程序根本无法继续进行

             错误明显影响到了用户的主要操作

             会导致其他连带错误

    区别非致命错误和致命错误的主要依据,就是看它们对用户的影响。

    6.把错误记录到服务器

             开发web应用程序过程中的一种常见做法就是集中保存错误日志,以便查找重要错误的原因。

    二、调试技术

    1.将消息记录到控制台

             可以通过控制台对象向javascript控制台中写入消息。这个对象具有以下方法:

             error:将错误记录到控制台

             info:将信息性消息记录到控制台

             log:将一半消息记录到控制台

             warn:将警告消息记录到控制台

    2.将消息记录到当前页面

             另一种输出调试消息的方式,就是在页面中开辟一个小区域,用以显示消息。例如,可以将log()函数修改为如下所示:

             function  log( message ) {

                      var  console = document.getElementById ( “debuginfo” ) ;

                      if ( console === null ) {

                              console = document.createElement( “div” ) ;

                              console.id = “debuginfo” ;

                              console.style.background = “#dedede” ;

                              console.style.border = “1px solid silver” ;

                              console.style.padding = “5px” ;

                              console.style.width = “400px” ;

                              console.style.position = “absolute” ;

                              console.style.right = “0px” ;

                              console.style.top = “0px” ;

                              console.style.appendChild( console ) ;

                      }

                      console.innerHTML += “<p>” + message + “</p>” ;

             }

             这个修改后的log()函数首先检测是否已经存在调试元素,如果没有则会创建一个新的<div>元素,并为该元素创建一些样式,以便与页面中的其他元素区别开。然后,又使用了innerHTML,将消息写入到这个<div>元素中。结果就是页面中会有一小块区域显示错误消息。

    3.抛出错误

             自定义的错误通常都使用assert()函数抛出。这个函数接受两个参数,一个是求值结果应该为true的条件,另一个是条件为false时要抛出的错误。

     三、常见的IE错误

    (1)操作终止

    (2)无效字符

    (3)未找到成员

    (4)未知运行时错误

    (5)语法错误

    (6)系统无法找到指定资源

  • 相关阅读:
    C#制作在线升级程序
    C#中使用GUID的笔记
    C# WinForm 上传图片,文件到服务器的方法Uploader.ashx
    Java学习---多线程的学习
    Java学习---异常处理的学习
    Java学习---TCP Socket的学习
    Java学习---IO操作
    Java学习---JAVA的类设计
    Java学习---InetAddress类的学习
    Java学习---面向对象的远程方法调用[RMI]
  • 原文地址:https://www.cnblogs.com/koto/p/5138219.html
Copyright © 2011-2022 走看看