javascript学习笔记(5)--错误处理&错误类型&抛出错误

在执行JavaScript代码的时候,有些情况下会发生错误,错误分两种
一种是程序写的逻辑不对,导致代码执行异常

 var s = null; 
 var len = s.length; // TypeError:s is nul
length in null;//TypeError: right-hand side of 'in' should be an object, got null

null没有length属性,对于这种错误,要修复程序

一种是执行过程中,程序可能遇到无法预测的异常情况而报错,例如,网络连接中断,读取不存在的文件,没有操作权限等。对于这种错误,我们需要处理它,并可能需要给用户反馈

错误处理是程序设计时必须要考虑的问题,对于C这样贴近系统底层的语言,错误是通过错误码返回的

 int fd = open("/path/to/file", O_RDONLY); 
 if (fd == -1)//-1错误码
  { printf("Error when open file!"); } 

通过错误码返回错误,就需要约定什么是正确的返回值,什么是错误的返回值。上面的open()函数约定返回-1表示错误

而JavaScript提供了处理错误的函数,try … catch … finally

try …catch … finally的执行流程
当代码块被try { … }包裹的时候,就表示这部分代码执行过程中可能会发生错误,一旦发生错误,就不再继续执行try部分的后续代码,转而跳到catch,catch (e) { … }包裹的代码就是错误处理代码,变量e表示捕获到的错误。最后无论有没有错误,finally一定会被执行

所以,有错误发生时执行流程

  1. 先执行try { … }的代码;
  2. 执行到出错的语句时,后续语句不再继续执行,转而执行catch (e) { … }代码
  3. 最后执行finally { … }代码

而没有错误发生时,执行流程像这样

  1. 先执行try { … }的代码;
  2. 因为没有出错,catch (e) { … }代码不会被执行
  3. 最后执行finally { … }代码
    (提醒一下:使用变量e只是一个习惯用法,也可以用其他变量名命名,如catch(er),这个变量只是代表出现的错误,并没有强制要求变量名)
var r1, r2, s = null;
try {
  r1 = s.length; //这个地方出错了,所以r2赋值不会被执行 
  r2 = 100;  } 
  catch (e) { alert('出错了:' + e); } 
  finally { console.log('finally'); }
  console.log('r1 = ' + r1);//r1 = undefined 
  console.log('r2 = ' + r2);//r2 = undefined

运行后可以发现,弹出的Alert提示“出错了:TypeError: s is null ”

其实,catch和finally可以不必都出现,也就是说,try语句一共有三种形式
完整的try …catch … finally
只有try …catch,没有finally:
只有try … finally,没有catch

JavaScript有一个标准的Error对象表示错误,还有从Error派生的TypeError、ReferenceError等错误对象
在处理错误时,可以通过catch(e)捕获的变量e访问错误对象

try
 {... } 
 catch (e) 
{ 
if (e instanceof TypeError) 
{ alert('Type error!'); } 
else if (e instanceof Error) 
{ alert(e.message); }
 else { alert('Error: ' + e); } 
}

TyoeErrir也是Error的一个类
instanceof 是JavaScript中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:

boolean result = obj instanceof Class

其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
刚才我也试了一下

var a=TypeError
a instanceof TypeError//false

抛出错误
程序也可以主动抛出一个错误,让执行流程直接跳转到catch块
抛出错误使用throw语句
下面的代码让用户输入一个数字,程序接收到的实际上是一个字符串,然后用parseInt()转换为整数,当用户输入不合法的时候,我们就抛出错误

对了,刚才忘记说了,catch(e)
e相当于是Error: 输入错误
e.message是输入错误(具体的内容)
至于是选择e还是选择e.message就看你的需要啦

 var r, n;
  try {
 n =parseInt(prompt('请输入一个数字'));
 if (isNaN(n)) 
 { throw new Error('输入错误'); } //如果是错误就直接跳过后面内容,可以通过输入非数字主动报错
 r = n * n; 
 alert(n + ' * ' + n + ' = ' + r); } 
 catch (e)
  { alert('出错了:' + e.message); }

实际上,JavaScript允许抛出任意对象,包括数字、字符串,但是,最好还是抛出一个Error对象
最后,当我们用catch捕获错误时,一定要编写错误处理语句,因为可以及时知道程序执行过程中到底有没有发生错误,进而及时debug
所以下面两种写法,最好还是给catch里面加点内容吧

 var n = 0, s; 
 try 
 {n = s.length; } 
 catch (e) 
 { console.log(e); }
 console.log(n); 
 var n = 0, s;
  try {n = s.length; }
   catch (e) { }
   console.log(n);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章