Javascript 异常处理

本文详细介绍JavaScript中的异常处理技术,包括异常的概念、使用try...catch...finally语句捕获异常的方法、自定义异常信息及触发异常的方式,并探讨了多层异常处理的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(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>
  try {
    document.writeln(开始执行try块语句 ---> )
    document.writeln(还没有发生例外 ---> )
     alert(eval(prompt(输入一个值:,)))
   } catch(err) {
     document.writeln(捕捉到例外,开始执行catch块语句 --->);
     document.writeln(错误名称: + err.name+ ---> );
     document.writeln(错误信息: + err.message+ ---> );
  } finally {
     document.writeln(开始执行finally块语句)
  }
  </script>

 
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)

五、例外的表现形式: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的取值一共有六种,如下:

 
 evalerror:eval()的使用与定义不一致
  rangeerror:数值越界
  referenceerror:非法或不能识别的引用数值
  syntaxerror:发生语法解析错误
  typeerror:操作数类型错误
  urierror:uri处理函数使用不当

六、定制例外信息

  上述的六种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页面真正地不出例外、善解人意。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值