以前,我一直喜欢用console.log(do some thing)去执行输出的类型和值,想马上看到弹出的信息,就会直接在浏览器alert()一下,这些是基础知识。

稍微复杂一点点,就要用到判断语句,if else进行条件判断,话说if条件else否则,这样的判断对于写程序代码的码侬已经是非常熟悉不过了。

如果你觉得这个也很简单,可能会用到混合if else条件判断语句加上try catch 来处理语句,虽然用try catch能处理任何的对象,通过throw扔一条有错误的语句,接着catch抛出该对象或者该对象的错误,今天我们只说try...catch,下面的例子分别抛出数组、时间、原型函数、数字类型等。

function trycatch () {
var array = [234],
newdate = new Date(),
fun = function(){},
is = 12.22,
call;
try{
throw array + '\n' + newdate.toLocaleString() + ' \n' + fun.prototype.constructor +
'\n' + (typeof is == 'number') +' \n' + call ; //小心local后面还有一个'e'
}
catch(e){
console.log(e);
}
finally{
console.log('err finally');
}
}
trycatch ()
// 输出: // // 2015/10/12 下午10:07:03 // function (){} // true // undefined

更准确的说,try内放一条可能产生错误的语句。当try语句开始执行并抛出错误时,catch才执行内部的语句和对应的try内的错误信息message。何时执行finally语句,只有当try语句和catch语句执行之后,才执行finally语句,不论try抛出异常或者catch捕获都会执行finally语句。

function trycatch () {
try{
throw new Error('koringz');
}
catch(e){
console.log(e.message);
}
finally{
console.log('err finally');
}
}
trycatch ()
// 输出:
// koringz
// err finally

通过try扔出一条错误的语句,我们看到在catch捕获到一条错误的的信息// koringz,但是同样的finally也输出了// err finally。虽然我们了解try catch工作流的处理方式,但是并不了解finally块的代码处理程序,按照以往我们对finally语句一贯的思维方式,就是finally输出不受try和catch的限制和约束。以下是finally的几个输出演示代码:

function trycatch () {
try{
throw new Error('koringz');
}
finally{
console.log('err finally');
return console.log('new finally')
}
}
trycatch ()
// err finally
// new finally

如上所示,try扔一条错误的语句,finally输出的结果是: // err finally  // new finally。

function trycatch () {
try{
throw new Error('koringz');
}
catch(e){
console.log('err finally');
return console.log('new finally')
}
}
trycatch ()
// err finally
// new finally

如上所示,try扔一条错误的语句,catch捕获到错误输出结果同上finally。 // err finally  // new finally。

当我修改try的语句:

function trycatch () {
try{
//
}
catch(e){
console.log('err finally');
return console.log('new finally')
}
}
trycatch ()
// 空(viod)
// 空(viod)

结果就输出都为空。// 空(viod)。因为try没有扔出错误,所以catch没有捕获到异常,故输出结果就为空。

那么我们再看看下面这个案例,通过下面的例子,可能会让你更加地了解try catch语句的异常处理。

try{
try{
throw new Error('open');
}
catch(e){
console.info(e.message);
throw e
}
finally{
console.log('finally');
}
}
catch(e){
console.log('op',e.message);
}
// open
// finally
// op open

当我们在try可能引发错误的代码块内嵌套try catch,通过嵌套的代码块try内扔一条可能出现错误的语句 throw new Error('open');,紧接着嵌套的try将错误传递给嵌套的catch处理,最终通过嵌套的finally运行过后,我们看到最后一条结果// op open,其实嵌套的catch捕获的错误信息扔给最外层catch捕获的。// op open

也就是说:任何给定的异常只会被离它最近的封闭catch块捕获一次。

当然,在“内部”块抛出的任何新异常(因为catch块里的代码也可以抛出异常),都将会被“外部”块所捕获。

参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/try...catch

参考资料:https://msdn.microsoft.com/library/4yahc5d8(v=vs.94).aspx

javascript:理解try...catch...finally的更多相关文章

  1. javascript中 try catch用法

    javascript中 try catch用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-08-16我要评论 JS try catch语句一般在什么情况下使用?是必须使 ...

  2. JavaScript:理解worker事件api

    如果你不是很了解Event事件,建议先看我上一篇随文javascript:理解DOM事件.或者直接看下文worker api. hack 首先,我们需要实例一个Worker的对象,浏览器会根据新创建的 ...

  3. JavaScript:理解Promise方法

    什么是promise? Promise的核心思想是代表异步操作的一个结果,并且promise具有三个状态(pending初始状态,fulfilled成功状态,rejected失败状态).我们可以理解为 ...

  4. C#和Javascript的try…catch…finally的一点差别

    C#中规定:如果程序的控制流进入了一个带finally块的try语句,那么finally语句块始终会被执行 例子: class Program { static void Main(string[] ...

  5. javascript:理解DOM事件

    首先,此文不讨论繁琐细节,但是考虑到读者的心灵感受,本着以积极向上的心态,在此还是会列举示例说明. ​标题为理解DOM事件,那么在此拿一个简单的点击事件为例,希望大家看到这个例子后能触类旁通. DOM ...

  6. JavaScript——理解闭包及作用

    js是一个函数级语言,变量的作用域是: 内部可以访问内部,内部可以访问外部,外部不能访问内部. 如果要在外部,访问函数内部的变量,就要用到闭包.闭包就是指访问到了本不该访问的变量. 闭包作用1:实现封 ...

  7. javascript理解js中的闭包

    在javascript中变量有其作用域,如果在函数内部var一个变量,那么在函数外部一般情况下是不能被引用的. function outerFun() { ; alert(a); } ; outerF ...

  8. Javascript理解this对象

    this是函数运行时自动生成的一个内部对象,只能在函数内部使用,但总指向调用它的对象. 通过以下几个例子加深对this的理解. (1)作为函数调用 var name = 'Jenny'; functi ...

  9. JavaScript理解

    Javascript,是从类型(type)开始,这些类型在JS中分为两大类:原生类型与对象类型.原生类型包括:number,string, boolean, null, undefined:剩下的非原 ...

随机推荐

  1. go语言web开发框架_Iris框架讲解(六):Session的使用和控制

    在实际的项目开发中,我们会经常有业务场景使用到Session功能.在iris框架中,也为我们提供了方便使用,功能齐全的Session模块.Session模块的源码目录为kataras/iris/ses ...

  2. DNS 网关 路由 交换机 网桥 协议 服务器 这些都是什么关系?

    来源:知乎 服务器:为你提供服务的机器.相当于马路边上的各种店面.虽然理论上任何一户人家都能开店为你提供服务,但是因为各种硬件资源限制而不适合开店.比如:小区道路比较窄(宽带带宽比较窄).家里地方太小 ...

  3. 【转载】C#中可使用Unity容器实现属性注入

    简介 Unity :Unity是微软团队开发的一个轻量级,可扩展的依赖注入容器,为松散耦合应用程序提供了很好的解决方案,支持构造器注入,属性注入,方法注入. 控制反转:(Inversion of Co ...

  4. springboot批量导入excel数据

    1 背景 小白今天闲着没事,在公司摸鱼,以为今天有事无聊的一天,突然上头说小子,今天实现一下批量导入Excel数据吧,当时我的内心是拒绝的,然后默默打开idea. 2 介绍 2.1 框架 java本身 ...

  5. 记录一下今天犯得错误,public static function init()写成了public function initialize()

    tp5模型事件是放在函数 public static function init() 而我写成了初始化函数,编辑器生成的 public function initialize() 开始时用着没出问题, ...

  6. Tensorflow安装教程-Win10环境下

    背景:最新版的Tensoflow已经支持Python3.6 首先,下载并安装Anaconda3 内置Python3.6的版本 https://www.continuum.io/downloads 安装 ...

  7. ERROR: Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' (ret = 2) from /usr/local/etc/php-fpm.conf at line WARNING: Nothing matches the include pattern '/usr/local/php7/etc/php-fpm.d/*.conf'

    Building from source is not easy if something is a bit different, and I had a hard time with some di ...

  8. 聊聊tcpdump与Wireshark抓包分析

    1 起因# 前段时间,一直在调线上的一个问题:线上应用接受POST请求,请求body中的参数获取不全,存在丢失的状况.这个问题是偶发性的,大概发生的几率为5%-10%左右,这个概率已经相当高了.在排查 ...

  9. linux使用echo指令向文件写入内容

    echo "aaa">test.sh 该指令会覆盖文件原内容,如果文件不存在,则创建 echo "aaa">>test.sh 追加文件内容 h ...

  10. 关于docker下容器和宿主机器时间不一致问题

    在前几天,在阿里云的ECS上部署一个docker应用时,发现部署的应用在请求第三方应用时,一直出现超时的异常提示,刚开始以为是第三方应用系统的问题(此系统无赖躺枪,反正也不是一次两次了,多躺几次也就习 ...