JavaScript高级应用:例外处理

程序开发中,程人员经常要面的是如何写代来响应错误事件的生,即例外理(exception handlers)。如果例外理代码设计得周全,那现给的就将是一个友好的界面。否,就会让访问莫名的象感到真正的意外。本文就将你介Web开发JavaScript言的例外理技

  一、什是例外

  当JavaScript程序在运行中生了如数索引越界、型不匹配或者错误时JavaScript器就会引例外理。ECMAScript了六种类型的错误,除此之外,我可以使用Error象和throw句来建并引自定的例外理信息。

  二、例外理技

  通运用例外理技,我可以实现构化的方式来响应错误事件的生,例外理代与正常脚本代科学分离,最使我集中精力写完成主要功能的核心程序。

  三、使用 try…catch…finally 行例外

  在JavaScript中,我使用try…catch…finally句来行例外理,即通它来捕捉错误发生后致的例外或者throw生的例外。它的基本如下:
 

 try {
  // 此
是可能生例外的
  } catch(error) {
  // 此
负责例外理的
  } finally {  // 此
是出口
  }

  上述代中,try中的句首先被行。如果运行中生了错误,控制就会移到位于catch句,其中括号中的error参数被作例外传递。否catch句被跳行。无错误时catch中的行完,或者没有错误try中的行完,最后将finally中的句。

  下面我来看一个例子:

<script language="JavaScript" type="text/javascript"> <br>   try {<br>     document.writeln("开始执行try块语句 ---> ")<br>     document.writeln("还没有发生例外 ---> ")<br>      alert(eval(prompt("输入一个值:","")))<br>    } catch(err) {<br>      document.writeln("捕捉到例外,开始执行catch块语句 --->");<br>      document.writeln("错误名称: " + err.name+" ---> ");<br>      document.writeln("错误信息: " + err.message+" ---> ");<br>   } finally {<br>      document.writeln("开始执行finally块语句")<br>   }<br> </script>

  在浏览器中行上述代后,首先对话框:



  我们输abc,然后确定,果如下:
 

  try块语 ---> 没有生例外 ---> 捕捉到例外,catch块语 ---> 错误名称: TypeError ---> 错误信息: 'abc' 未定 ---> finally块语

  上述例程以try块语始,当出信息没有生例外后,对话框,要求用户输入一个数,当我们输入非法的信息"abc"后,就引了一个例外,所以剩下的try中的句将被跳catch块语句。Catch块开始的err参数作为这个例外的错误对象,它具有namemessage两个属性。最后,finally句。

  下面我再次运行段代,并入一个正确的数123

 

 

  你会看到如下的果:

 

 

  我看到,由于没有错误发生,当try行完后,catch块语句被跳,出一个窗口入的数,最后行了finally句。

四、try...catch...finally的

  try…catch…finally句有两种变用,即try…catch或者try…finally。

  try…catch这种结构最常,它的程是:当没有例外行完try块语句后或者生例外行完catch块语句后,控制将移到整个try…catch构后面的句。看下面的例子:
 

  try {
    document.writeln("Beginnng the try block")
    document.writeln("No exceptions yet")
  // Create a syntax error
  eval("6 + * 3")
  document.writeln("Finished the try block with no exceptions")
  } catch(err) {
    document.writeln("Exception caught, executing the catch block")
    document.writeln("Error name: " + err.name)
    document.writeln("Error message: " + err.message)
  }
  document.writeln("Executing after the try-catch statement")

  如果是try…finally构,那生例外,由于没有catch块语句来捕捉错误,所以最finally句也不会被行。因此,这种结构在实际应用中很少

  五、例外的表形式:Error

  在JavaScript,例外是作Error象出的。Error象有两个属性:name属性表示例外的型,message属性表示例外的含。根据些属性的取,我可以决定理例外的方式,比如:
 

  function evalText() {
  try {
    alert(eval(prompt("Enter JavaScript to evaluate:","")))
  } catch(err) {
    if(err.name == "SyntaxError") alert("Invalid expression")
    else alert("Cannot evaluate")
  }
  }

  上面的代户输入的内容行表达式求,然后示出来。如果在求值过程中生了SyntaxErroe错误,那就会“Invalid expression”的信息;否,用得到信息“Cannot evaluate”

  Error.name的取一共有六,如下:

  EvalErroreval()的使用与定不一致
  RangeError:数越界
  ReferenceError:非法或不能识别的引用数
  SyntaxError法解析错误
  TypeError:操作数错误
  URIErrorURI理函数使用不当

六、定制例外信息

  上述的六Error型基本上覆盖了脚本程序运行所可能生的错误。除了型以外,我们还可以使用Error构造器来自定例外型,其法如下:

  myError = new Error(msg)

  其中msg参数表示所定的新例外的message属性。同,我们还可以建新的型以作Error的子型:

  function MyError(msg) {
  this.name = "MyError"
  this.message = msg
  }
  MyError.prototype = new Error;

  然后,我就可以建自定义错误例:

  myError = new MyError("My error message")

  七、触例外

  建一个Error象后,就可以使用throw句来触的例外。Throw法如下:

  throw errObj

  errObj是一个Error象或者Error的子型。在try中触一个例外后,控制将直接catch

  下面的代中,在try中触了一个例外,置例外信息“oops”,然后控制移到catch
 

  var s
  try {
    s = "one "
    throw new Error("oops")
    s += "two"
  } catch(err) {
    s += err.message
  }
  s += " three"
  alert(s)

  运行后出如下的提示框: 

 

 

  写代来触例外的点很多,比如有利于自定义错误类型,快速catch块执行,以及下面要介的在嵌套例外中将错误传递到外

八、嵌套例外

  JavaScript支持多次的嵌套例外理。一般情况下,我可以在内部例外理的catch码块中捕捉并错误,然后再次触例外,这样就可在外部例外理的catch码块中做更加深入的理。下面来看看一个嵌套例外理的例子:
 

  var inner;
  var outer;
  try {
    document.writeln("Beginning outer try block, no exceptions yet");
  try{
    document.writeln("Beginning inner try block, no exceptions yet");
    // 生成一个引用
错误
    document.writeln(undefinedVariable)
    document.writeln("Finished inner try block with no exceptions");
  } catch(inner) {
  // 内部例外

    document.writeln("Exception caught, beginning inner catch block");
    document.writeln("Error type: " + inner.name);
    document.writeln("Error message: " + inner.message);
    throw inner;
    document.writeln("No exceptions thrown in inner catch block");
  } finally {
    document.writeln("Executing inner finally block");
  }
    document.writeln("Finished outer try block with no exceptions");
  } catch(outer) {
    // 外部例外

    document.writeln("Exception caught, beginning outer catch block");
    document.writeln("Error type: " + outer.name);
    document.writeln("Error message: " + outer.message);
  } finally {
    document.writeln("Executing outer finally block");
  }

  行后的果如下:

  Beginning outer try block, no exceptions yet
  Beginning inner try block, no exceptions yet
  Exception caught, beginning inner catch block
  Error type: ReferenceError
  Error message: undefinedVariable is not defined
  Executing inner finally block
  Exception caught, beginning outer catch block
  Error type: ReferenceError
  Error message: undefinedVariable is not defined
  Executing outer finally block

  嵌套例外理的好在于使我很好地分错误,内部例外理可以负责解决由错误的脚本代码问题,外部例外用于负责提供的反信息或者例外信息行日志记录

  九、结语

  本文详细讨论JavaScript言的一个很重要的特征例外Web开发员应该很好地掌握它并在实际应用中灵活理,从而使包含脚本代HTML面真正地不出例外、善解人意。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值