如何评价 JS 的错误处理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
dou4cc
V2EX    Javascript

如何评价 JS 的错误处理?

  •  
  •   dou4cc 2017-02-25 11:46:11 +08:00 3567 次点击
    这是一个创建于 3227 天前的主题,其中的信息可能已经有所发展或是发生改变。
    throw...try...catch...finally 和大多数 domexception 是默认冒泡的, abstractworker. onerror 不冒,然后 promise.reject 可以延迟处理,却又出了个 onunhandledrejection

    。。。

    这是否意味着js从及时报错哲学转向带错执行哲学?
    其实我一直不懂错误处理的初衷,上下文丢失是很讨厌的事情,但错误处理不能规避死循环,其还原上下文的能力非常有限
    第 1 条附言    2017-02-25 12:27:03 +08:00
    第 2 条附言    2017-03-21 11:12:57 +08:00
    我发现在奇葩的 firefox55 中 absractworker. onerror 会再次抛到 window. onerror ,得用 event.preventDefault()拦下。
    10 条回复    2017-02-25 19:18:37 +08:00
    xialdj
        1
    xialdj  
       2017-02-25 12:08:04 +08:00 via iPhone
    有啥好评价的啊 应用内要用 try catch 的地方都用 if 来处理就可以了 只在应用的最外层做一个 try catch 来作为保护
    MinonHeart
        2
    MinonHeart  
       2017-02-25 12:53:51 +08:00 via iPhone
    JS :你的哲学我不懂
    otakustay
        3
    otakustay  
       2017-02-25 12:57:05 +08:00
    首先你要能把语言和应用环境分开,这个问题才有讨论的价值, js 的错误处理很简单,就一个 try/catch/finally ,没有冒泡没有全局处理

    而你说的 domexception 、 onerror 、 unhandledrejection 都是应用环境下的异常处理,这在任何一个语言 /框架里都是存在的,比如 ASP.NET 的 Application_Error ,比如 Spring MVC 的 @ControllerAdvice ,比如 ROR 的 exceptions_app ,在一个应用环境中,异常一定是要“冒泡”到全局下统一处理的,否则造成应用的崩溃在生产环境是一件非常危险的事情
    dou4cc
        4
    dou4cc  
    OP
       2017-02-25 13:02:38 +08:00
    @otakustay try/catch/finally 也算冒泡,如果不考虑 tick ,可以处理全局错误
    otakustay
        5
    otakustay  
       2017-02-25 13:08:04 +08:00
    @dou4cc 你要这么算也行,我没见过 exception 不冒泡的语言
    dou4cc
        6
    dou4cc  
    OP
       2017-02-25 13:08:40 +08:00
    murmur
        7
    murmur  
       2017-02-25 14:07:41 +08:00   1
    js 设计的不合理之处不是一点两点了, exception 和 promise 的问题,习惯就好了
    有句话说,错就错到底,就算错了大家都学会了就成了 feature
    结果看箭头函数的 this , array 新函数对空白位的处理,这异常又多个黑点

    当然我习惯是 if 把条件全检查好了,如果这都能出异常那真是牛逼。。
    chemzqm
        8
    chemzqm  
       2017-02-25 17:39:55 +08:00
    同步: .try...catch
    异步: promise.reject
    全局错误: onunhandledrejection
    只是某些例如 jquery 这种库为了操作 dom 方便把 dom 操作的报错去掉了,所以某些人会觉得混乱
    上下文丢失是实现问题,并不是设计问题,要么使用辅助库,要么等修复完善
    billlee
        9
    billlee  
       2017-02-25 18:21:19 +08:00
    @dou4cc Go 那个不叫 exception 吧,你怎么不说 C 呢
    zlgodpig
        10
    zlgodpig  
       2017-02-25 19:18:37 +08:00   1
    年轻的时候也经常思考各种设计是不是正确。现在觉得,对于 `Javascript` 这样的东西,思考太多并没有什么用,爱用用不用滚是一般的结论,(摊手
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2825 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 06:15 PVG 14:15 LAX 22:15 JFK 01:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86