利用throw方法在循环结束后终止代码执行

2 篇文章 0 订阅
1 篇文章 0 订阅

在原生js中,函数内部的for循环,我们可以利用return终止循环并停止循环后面的代码执行,如下

而在jq的$.each()的遍历中,return可以跳过当前的一次循环,return false则可以终止循环,但是它们都无法阻止循环之后的代继续执行码。

但是有时候我们确实要在遍历达成某种条件时既结束遍历,又终止之后的代码继续执行,怎么做呢?之前我是这么做的,加个变量做判断。

这样当然是可以达到想要的效果的,但是如果函数里有不止一个遍历,判断条件各不相同,我们可能就要加很多的变量,这样代码写起来就会感觉很混乱。所以我就考虑是否还有别的办法去终止代码执行呢?终止代码,当然首先想到的就是throw,手动抛错

这样看起来效果是达到了,但是控制台上一个鲜红的X似乎不是我们想看到的,毕竟这是手动抛错,是属于可控的异常,不需要用这种方式来提醒。

接下来用window.onerror来控制一下报错提示,并对throw方法进行包装。

var myThrow={
    _init(){
        window.onerror=function(msg,url,line,col,err){
            if(err.type && err.type=='myerr'){
                console[err.level](err)
                return true;
            }
        }
    },
    myError:function(errMsg,errLevel){
        this.msg=errMsg
        this.level=errLevel
        this.type='myerr'
    },
    _throw(msg,level){
        var myError=new this.myError(msg,level);
        throw myError;
    },
    _act(msg,level){
        myThrow._init();
        this._throw(msg,level)
    },
    log(msg,level){
        this._act(msg,'log')
    },
    warn(msg,level){
        this._act(msg,'warn')
    },
    error(msg,level){
        this._act(msg,'error')
    }
}

function jqList(){
    $.each([1,2,3,4,5,6],(i,t)=>{
        if(i==3){
            myThrow.warn('出错了')
        }
        console.log(i)        
    })
    console.log('看到这一行说明终止无效')
}
jqList()

调用时分别使用 myThrow.log、myThrow.warn、myThrow.error 来输出报错的级别,效果如下

----------------------------------------------------------------------------------------------------------------------

myThrow.log('出错了')

----------------------------------------------------------------------------------------------------------------------

myThrow.warn('出错了')

----------------------------------------------------------------------------------------------------------------------

myThrow.error('出错了')

----------------------------------------------------------------------------------------------------------------------

由于在window.onerror里对错误的type属性进行了区别,所以这种自定义报错只在myThrow的方法下产生作用,对其他的由浏览器抛出的错误不会造成影响。

这样就实现了终止代码,同时对抛错的级别进行控制。
如果有其它的比较好的实现办法,欢迎留言指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值