typescript & javascript 中的try-catch-finally的简单介绍
为了做一个简单测试,假设我用的运行环境为node,如果需要运行typescript,则需要node安装typescript插件tsc,通过tsc将typescript代码编译成为js代码,然后执行。
这里假设本机环境已经成功安装了node npm。
安装 tsc 只需要在控制台输入一下命令,就能够成功安装 tsc。如果不安装node无法直接执行ts代码
npm install typescript -g
安装后,编写typescript代码如下,并且保存该文件为main.ts
function chkTest(a:number,b:number):number{
if (b == 0){
throw new RangeError("the b value is can not be zero");
}
return a/b;
}
try{
console.log(chkTest(100,2));
console.log(chkTest(100,0));
}catch(err){
console.log(err);
}
使用tsc命令将main.ts编译成为js代码
tsc main.ts -outFile testmain.js
执行一下命令
node main.js
可以看到如下输入结果
D:\logs\typescript&js>node ./testmain.js
50
RangeError: the b value is can not be zero
at chkTest (D:\logs\typescript&js\testmain.js:16:15)
at Object.<anonymous> (D:\logs\typescript&js\testmain.js:22:17)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47
从这里我们能够出现了那些错误,并且能够正确显示出来错误的堆栈。有利于查找问题。
将上面代码中 throw new RangeError 修改为:throw new Error 如下所示:
function chkTest(a:number,b:number):number{
if (b == 0){
throw new RangeError("the b value is can not be zero");
}
return a/b;
}
try{
console.log(chkTest(100,2));
console.log(chkTest(100,0));
}catch(err){
console.log(err);
}
同样执行tsc编译,并且运行,堆栈信息如下:
Error: the b value is can not be zero
at chkTest (D:\logs\typescript&js\testmain.js:16:15)
at Object.<anonymous> (D:\logs\typescript&js\testmain.js:22:17)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47
同样能够看到报错信息和堆栈。
再看下面的例子:
console.log("你好");
try {
throw "我是一个错误";
console.log("这里不能被执行");
} catch (err) {
console.log(err);
} finally {
console.log("finally 中的 执行");
}
console.log("哈哈哈");
同样执行 tsc 编译,执行。看到如下输出:
你好
我是一个错误
finally 中的 执行
哈哈哈
好奇怪,没有错误堆栈的输入;明明是有异常的 try中也执行了throw,为什么没有异常信息。原因是:虽然TypeScript的throw关键字可以抛出任意值,但我们还是应该要尽量使用JavaScript内置的专门用来「被抛出」的对象。
个人理解:throw 关键字抛出的类型只有是javascript内置的错误类型,才会有堆栈信息的输入。
javascript中内置的错误类型
javscript 中内置的错误类型有多中,从直观上理解都是继承Error的。只所以说是直观上理解,是因为js本质是原型链,和其他强类型语言中的集成并不相同。
RangeError 对象可用来表示输入的数值超出范围
ReferenceError 当我们在javascript中使用javascript不认识的名称时,就会抛出这个对象,当然如果我们使用typescript进行开发的时候并不会经常遇到这种错误,因为typescript是有类型的,最少从直观上来说是这样的。
SyntaxError 语法错误,异常。比较常见的是,在编译一个有语法错误的typescript的时候,会有这个错误,这个错误不会带到执行阶段;还有一种情况 javascript中的evel方法,在执行一段脚本的时候会在执行节点报这种错误。
TypeError 如果一个变量被声明为any类型,原则上说他可以被赋值任意类型,那么在执行阶段,可能会因为类型的问题报错。
URIError JavaScript内置的encodeURI和decodeURI函数可以用来安全地编码与解码URI。
...
如果内置的类型不能满足需求,直接使用Error错误对象。
try{
throw new Error("我是一个错误");
//throw Error("我是一个错误"); Error 相关的对象可以不使用new关键字
}catch(err){
}finally{
}
finally的使用说明
try{
//正常执行
//代码块1
}catch(err){
//如果代码块1 中出现了错误,则代码会执行到这里,
//如果try中的代码没有异常,则catch代码块中的逻辑不会被执行
}finally{
//不管try中有没有出现异常,抛出错误,finally中的代码都会被执行
//finally可以用来错误 错误恢复
}
很赞哦! (0)