程序是从上到下顺序执行的,同时可以通过一些控制语句来改变执行的路线,受控制语句影响下,程序最终的执行路线就是控制流。

js 里面的控制语句有 if、for、while、try catch 等,它们都会改变程序的走向。

程序是操作数据的,随着程序的运行,也就是控制流的前进而改变的数据叫做数据流。

很明显,数据流是依赖控制流的,程序分析里面的数据流分析也是要先做控制流分析。

比如这样一段代码:

const a = 1;
let b;

if (a === 1) {
    b = '1111';
} else {
    b = '2222';
}

因为 a 为 1,所以会执行到 b = '1111';,这就是控制流,也就是程序最终执行的代码,可以用来分析程序的走向,做一些死代码删除之类的优化。

而随着控制流的执行,b 会被赋值为 2222,这就是数据流,也就是值的变化的过程,可以用来分析某个语句的变量的值。

程序是针对不同数据做不同的处理,如果数据有错误,那么处理程序也就没法处理了,就会报错,会中断后续的控制流。比如数据为空、数据格式不对等等。这时候就要通过 try catch 做错误处理,也叫异常处理。

我们做异常处理有两个目的:

1、对出错的逻辑做一些兜底处理。

比如参数解析有错误的时候,在 catch 里赋一个默认值。这种错误处理之后就没必要再报出来了。这种情况下 try catch 也是作为逻辑的一部分,相当于 if else。

2、对报的错做更场景化的描述。

JS 的报错是 JS 引擎抛出的,比如调用了一个 null 对象的方法会报 TypeError,使用了未声明的变量会报

ReferenceError。而具体的 Error 是在不同场景下报出的,就有不同的含义:

如果这个对象是来自用户输入的,那就是用户输入的有错误,如果这个对象是从服务端获取的,那就意味着服务端返回的数据有错误。在不同的场景下,同一个 Error 会有更具体的含义,所以我们要做 try catch。然后抛出一个自定义的错误,包含有场景信息的错误描述。

这点很多库和框架做的都比较好,报出的错都是有具体的场景信息,甚至还有解决方式,而且还有的通过错误编号做了管理,可以通过 errorno 来查询解决方式。这种就是对错误做了自定义的处理。

而很多业务代码中报的错就并没有做这种处理,是直接把原生 Error 给报出来了。我们会通过异常监控平台来收集一些 throw 到全局的错误,而这些错误往往都是比较原始的信息,虽然带上了错误位置和堆栈,但还要通过看源码来定位问题。

比如报了一个对象为空的错误,但是我怎么知道这是什么对象为空,会是什么原因,怎么解决,有没有编号。

如果我们能够对各种错误 catch 之后 throw 出一些具体场景的自定义错误,那是不是就好的多了。这点第三方库都做得很好,而业务代码很少有人注重场景化的自定义错误。

当然,前端业务代码的用户是通过界面来使用该软件的,其实只要对各种错误做一些 UI 上的提示就可以。而库的代码是给开发者用的,那么就要对各种错误做场景化的描述,甚至给错误编号并给出解决方案。

但我觉得业务代码也应该像第三方库代码那样来对待错误,不要把没有啥意义的原生错误报出来,而是报一些有具体含义的自定义错误,这样排查和解决问题就会简单很多。

不过虽然场景化的自定义错误可以更好的帮助排查问题,那也一定是建立在对该段代码可能报的错误有把握的情况下。要是自己报出的错误信息和实际的错误原因不一样,反而会增加排查问题的难度,还不如把原生错误报出来。

总结

程序执行的流程是控制流,受控制语句影响,执行的过程中会改变数据,数据的变化叫做数据流,控制流和数据流是程序分析里面经常分析的两个方面。

错误会中断控制流,我们要对错误做一些处理,通过 try catch。

错误处理有两个目的:

一个是做一些兜底的处理,相当于 if else,不需要再把错误报出来。

一个是做对原生的 JS 错误做场景化的描述,创建一个有更具体信息的错误对象抛出来。

这点很多库做的很好,甚至还会给错误编号并给出解决方式。但业务代码其实很多只做了给用户的 UI 上的反馈,没有对抛出的错误做场景化的包装。这就导致了错误监控平台收集到的错误都是比较原始的错误,需要查看源码来排查。如果也能像库的代码那样做一些场景化的错误包装,统计和排查起问题来会容易很多,这点大多数 Javascript 工程师都没做到。

到此这篇关于Javascript中try catch作用的文章就介绍到这了,更多相关Javascript中try catch作用内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

聊聊Javascript中try catch的2个作用的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 我可以安全地在@try catch块中包装’CoreData无法解决错误’错误

    )是的,我偶尔会得到’CoreData无法完成故障’的错误.在我的特定应用程序中,这通常发生在一种“数据绑定”过程中,因此我可以安全地丢弃故障对象并继续前进.我想通过在@try-catch块中包装数据绑定的循环内部并且只跳过我得到CoreData错误的行来完成此操作.我可以使用CoreData安全地执行此操作吗?

  4. 你如何压缩iOS上的Realm DB?

    我想定期在iOS上压缩一个Realm实例来恢复空间.我认为该过程是将数据库复制到临时位置,然后将其复制回来并使用新的default.realm文件.我的问题是Realm()就像一个单例并且回收对象,所以我无法真正关闭它并告诉它打开新的default.realm文件.这里的文档(https://realm.io/docs/objc/latest/api/Classes/RLMRealm.html)建

  5. ios – 捕获NSKeyedUnarchiver异常

    在Swift中,如果无法取消存档数据,NSKeyedUnarchiver.unarchiveObjectWithData(data)将抛出异常.在某些情况下,我们无法保证数据是否未损坏,例如从文件读取时.我不知道Swift中的try/catch机制,也不知道像canUnarchive这样有助于防止异常的方法.除了在Obj-C中实现try/catch之外,还有一个纯Swift解决方案来解决这个问题吗

  6. ios – 使用swift进行异常处理

    catch来处理它.如果故事板中没有视图控制器,则无法执行任何操作.这是程序员的错误,创建它的人应该处理这些问题.你不能因为这种错误而责怪iOS运行时.

  7. ios – Swift 3 – 将文件夹从主包复制到文档目录

    我的主要包中包含文件夹,我想在首次启动应用程序时将它们复制/剪切到文档目录,以便从那里访问它们.我见过一些例子,但他们都在Obj-C中,我正在使用Swift3.我怎么能这样做?解决方法我设法使用2个功能:

  8. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  9. Swift 2.0 try? 的替代方法

    你可以配合着if-let或者guard语句来使用try?但你可以试着写出try?实际上我也不太喜欢tryit这个名字,你用你喜欢的名字代替就好。你可以以同样的方法调用它:你仍然不能基于错误类型和错误细节来制定错误处理策略,但是这种实现方式也不像try?你也可以修改tryit函数,让它也能接受做错误处理的代码块,但因为要处理两种不同的代码块,这个函数就会变得相当臃肿。如果要用try而且又需要进行错误处理的话,你就必须得用do-catch或者像结果枚举之类的其它方法了。

  10. The Swift Programming Language 翻译 —— 错误处理

    Swift支持抛出、捕获、传递和操作等四种方式来处理程序运行时出现的可恢复性错误。表示错误类型在Swift中,错误类型用继承了ErrorType协议的类型来表示。Swift中处理错误的方式有如下四种:使用throw关键字继续向上传递这个错误、使用do-catch表达式处理这个错误、使用try?下面例子中的buyFavoriteSnack方法调用了vend方法,任何vend方法抛出的错误都将传递给他,他选择继续向上传递这些错误。x和y的类型是someThrowingFunction()的返回值类型对应的可选

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部