typescript & javascript 中的try-catch-finally的简单介绍

为了做一个简单测试,假设我用的运行环境为node,如果需要运行typescript,则需要node安装typescript插件tsc,通过tsc将typescript代码编译成为js代码,然后执行。

这里假设本机环境已经成功安装了node npm。
安装 tsc 只需要在控制台输入一下命令,就能够成功安装 tsc。如果不安装node无法直接执行ts代码

  1. npm install typescript -g

安装后,编写typescript代码如下,并且保存该文件为main.ts

  1. function chkTest(a:number,b:number):number{
  2. if (b == 0){
  3. throw new RangeError("the b value is can not be zero");
  4. }
  5. return a/b;
  6. }
  7. try{
  8. console.log(chkTest(100,2));
  9. console.log(chkTest(100,0));
  10. }catch(err){
  11. console.log(err);
  12. }

使用tsc命令将main.ts编译成为js代码

  1. tsc main.ts -outFile testmain.js

执行一下命令

  1. node main.js

可以看到如下输入结果

  1. D:\logs\typescript&js>node ./testmain.js
  2. 50
  3. RangeError: the b value is can not be zero
  4. at chkTest (D:\logs\typescript&js\testmain.js:16:15)
  5. at Object.<anonymous> (D:\logs\typescript&js\testmain.js:22:17)
  6. at Module._compile (internal/modules/cjs/loader.js:1063:30)
  7. at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
  8. at Module.load (internal/modules/cjs/loader.js:928:32)
  9. at Function.Module._load (internal/modules/cjs/loader.js:769:14)
  10. at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
  11. at internal/main/run_main_module.js:17:47

从这里我们能够出现了那些错误,并且能够正确显示出来错误的堆栈。有利于查找问题。

将上面代码中 throw new RangeError 修改为:throw new Error 如下所示:

  1. function chkTest(a:number,b:number):number{
  2. if (b == 0){
  3. throw new RangeError("the b value is can not be zero");
  4. }
  5. return a/b;
  6. }
  7. try{
  8. console.log(chkTest(100,2));
  9. console.log(chkTest(100,0));
  10. }catch(err){
  11. console.log(err);
  12. }

同样执行tsc编译,并且运行,堆栈信息如下:

  1. Error: the b value is can not be zero
  2. at chkTest (D:\logs\typescript&js\testmain.js:16:15)
  3. at Object.<anonymous> (D:\logs\typescript&js\testmain.js:22:17)
  4. at Module._compile (internal/modules/cjs/loader.js:1063:30)
  5. at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
  6. at Module.load (internal/modules/cjs/loader.js:928:32)
  7. at Function.Module._load (internal/modules/cjs/loader.js:769:14)
  8. at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
  9. at internal/main/run_main_module.js:17:47

同样能够看到报错信息和堆栈。

再看下面的例子:

  1. console.log("你好");
  2. try {
  3. throw "我是一个错误";
  4. console.log("这里不能被执行");
  5. } catch (err) {
  6. console.log(err);
  7. } finally {
  8. console.log("finally 中的 执行");
  9. }
  10. console.log("哈哈哈");

同样执行 tsc 编译,执行。看到如下输出:

  1. 你好
  2. 我是一个错误
  3. finally 中的 执行
  4. 哈哈哈

好奇怪,没有错误堆栈的输入;明明是有异常的 try中也执行了throw,为什么没有异常信息。原因是:虽然TypeScript的throw关键字可以抛出任意值,但我们还是应该要尽量使用JavaScript内置的专门用来「被抛出」的对象。

个人理解:throw 关键字抛出的类型只有是javascript内置的错误类型,才会有堆栈信息的输入。

javascript中内置的错误类型

javscript 中内置的错误类型有多中,从直观上理解都是继承Error的。只所以说是直观上理解,是因为js本质是原型链,和其他强类型语言中的集成并不相同。

  1. RangeError 对象可用来表示输入的数值超出范围
  2. ReferenceError 当我们在javascript中使用javascript不认识的名称时,就会抛出这个对象,当然如果我们使用typescript进行开发的时候并不会经常遇到这种错误,因为typescript是有类型的,最少从直观上来说是这样的。
  3. SyntaxError 语法错误,异常。比较常见的是,在编译一个有语法错误的typescript的时候,会有这个错误,这个错误不会带到执行阶段;还有一种情况 javascript中的evel方法,在执行一段脚本的时候会在执行节点报这种错误。
  4. TypeError 如果一个变量被声明为any类型,原则上说他可以被赋值任意类型,那么在执行阶段,可能会因为类型的问题报错。
  5. URIError JavaScript内置的encodeURIdecodeURI函数可以用来安全地编码与解码URI
  6. ...

如果内置的类型不能满足需求,直接使用Error错误对象。

  1. try{
  2. throw new Error("我是一个错误");
  3. //throw Error("我是一个错误"); Error 相关的对象可以不使用new关键字
  4. }catch(err){
  5. }finally{
  6. }

finally的使用说明

  1. try{
  2. //正常执行
  3. //代码块1
  4. }catch(err){
  5. //如果代码块1 中出现了错误,则代码会执行到这里,
  6. //如果try中的代码没有异常,则catch代码块中的逻辑不会被执行
  7. }finally{
  8. //不管try中有没有出现异常,抛出错误,finally中的代码都会被执行
  9. //finally可以用来错误 错误恢复
  10. }
2021-08-10 10:46:44  user 阅读(601) 评论(0) 标签:typescript,javscrip 分类:typescript javascript