JavaScript编程的一个重要组成部分,是添加错误处理来应对可能会出现的问题。默认情况下,如果因为你的JavaScript中的问题二产生了一个代码异常,那么脚本就会失败并且无法完成加载。这通常不是我们期望的行为。事实上,这往往是灾难性的行为。为了防止这些类型的大问题,你应该把代码包装在一个try/catch块中。

  

  1、try/catch块

  为了防止代码完全崩溃,使用try/catch块来处理代码中的问题。如果在执行JavaScript的try块中的代码时遇到错误,它就会跳出来,并执行catch部分,而不是停止执行整个脚本。如果没有错误,那么整个try块将会被执行,并且不会有catch块将被执行。

  例如,下面的try/catch块试图把一个名为badVarName的未定义的变量的值赋值到变量x:

  try{

    var x = badVarName;

  }catch(err){

    console.log(err.name + ':"' + err.message + '" occurred when assigning x.');

  }

  请注意,catch语句接受一个err参数,这是一个error对象。error对象提供message属性,它提供了错误信息的描述。error对象还提供了一个name属性,它是抛出的错误类型的名称。

  上述代码产生一个异常以及如下的消息:

  ReferenceError:"badVarName is not defined" occurred when assigning x.

  2、抛出你自己的错误

  你也可以使用throw语句抛出自己的错误。下面的代码演示了如何将throw语句添加到一个函数来抛出一个错误(即时不发生脚本错误)。函数sqrRoot()接受一个参数x。然后,它测试x以验证它是一个正数,并返回一个表示x的平方根的字符串。如果x不是一个正数,则相应的错误被抛出,而catch块返回该错误:

  function sqrRoot(x){

    try{

      if(x=="")    throw{message:"can't square root nothing"};

      if(isNaN(x))    throw{message:"can't square root strings"};

      if(x<0)       throw{message:"sorry no imagination"};

      return "sqrt("+x+") = " + Math.sqrt(x);

    }catch(err){

      return err.message;

    }

  }

  function writeIt(){

    console.log(sqrRoot("four"));

    console.log(sqrRoot(""));

    console.log(sqrRoot("4"));

    console.log(sqrRoot("-4"));

  }

  writeIt();

  下面是控制台输出,显示根据向sqrRoot()函数输入的参数内容,抛出的不同错误:

  can't square root nothing

  can't square root strings

  sqrt(4) = 2

  sorry no imagination

  3、使用finally

  异常处理的另一个重要工具是finally关键字。你可以在一个try/catch块的结束处添加这个关键字。执行try/catch块之后,无论是否有错误发生并被捕获或者try块被完全执行,finally块总是被执行。

  下面是在一个网页内使用finally块的例子:

  function testTryCatch(value){

    try{

      if(value<0){

        throw"too small";

      }else if(value>10){

        throw"too big";

      }

      your_code_here

    }catch(err){

      console.log("the number was " + err);

    }finally{

      console.log("this is always written.");

    }

  }

最新文章

  1. 在 C# 中执行 msi 安装
  2. 在iOS中使用OpenSSL的Public Key 进行加密
  3. 【BZOJ-4518】征途 DP + 斜率优化
  4. nyoj116_士兵杀敌(二)_树状数组
  5. SHA1加密C#
  6. spring项目中使用定时任务
  7. MTK平台缩写
  8. Android 开发笔记 “The constructor AlertDialog.Builder(new View.OnKeyListener(){}) is undefined”
  9. Android采用canvas绘制各种图形
  10. ERP中的地区管理
  11. Elasticsearch学习笔记(十)批量查询mget、批量增删改bulk
  12. 理解React组件的生命周期
  13. lombok @EqualsAndHashCode 注解的影响
  14. 阿里八八Alpha阶段Scrum(10/12)
  15. 浏览器Quirksmode(怪异模式)与CSS1compat
  16. 【Android】Retrofit网络请求Service,@Path、@Query、@QueryMap...
  17. rabbitmq的安装和使用
  18. BP反向传播算法的工作原理How the backpropagation algorithm works
  19. 从0开始 数据结构 字典树 hdu1251
  20. sqlserver修改sa密码(在windows登陆没有权限的情况下)

热门文章

  1. 深入理解Java虚拟机之读书笔记三 内存分配策略
  2. [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据
  3. 全栈工程师学习Linux技术的忠告
  4. NGUI Sprite 和 Label 改变Layer 或父物体后 未更新深度问题
  5. MyEclipse自带maven找不到或自己外置安装
  6. TMethod
  7. 7.4---加法替代运算(CC150)
  8. 【leetcode】Unique Binary Search Trees
  9. struts2 模型驱动
  10. Robot Framework + Selenium2Library环境下,结合Selenium Grid实施分布式自动化测试