js 好的程序设计,应该什么时候使用 try catch 呢?

如题。 比如 在检测浏览器是否支持某些功能的时候

if (!xx) {
  console.error('此浏览器不支持 xx 功能')
}

还是

try {
  xx;
} 
catch(e) {
  throw new Error('此浏览器不支持 xx 功能');
}

上面这个列子可能并不恰当,只是抛出问题,希望大神可以全面的指点下。

阅读 10.4k
9 个回答

jquery 让 dom 操作不报错,结果现在很多前端以为 try catch 都用不着了。
https://github.com/inexorabletash/polyfill/blob/master/es5.js
这里有个例子,通过try catch 监测浏览器是否实现某个功能是个好习惯,如果不支持,有时候可以采用降级处理。

那些不处理的异常的,估计也就写写网页吧,一个严肃的应用出现js报错是非常影响用户体验的事情!

如果你无法降级处理,做法也不应该是直接抛出异常,好的体验应该是告诉用户你的应用部分功能不支持他现在的浏览器,提示他更换,抛错会让用户无所适从。

如果是你是开发组件给别人用,最好提前在说明中声明使用了哪些新特性

总结一下为什么大家可能不太用try catch以及什么时候用try catch比较好:

为什么大家认为可能没有多少人使用try catch

一,现实层面

  1. 因为javascript总是被别人当做玩具语言,很丑的脚本语言,甚至都不被认为是真正的语言,所以大家甚至都没有想到可能有需要try catch的时候。

  2. 因为javascript是浏览器唯一广泛支持的语言,用的人非常多,这样的话就有很多就会不专业的人写的大量糟糕的代码

二,语言层面

  1. 脚本语言有很好地容错性,像类型转换等,所以很多情况下其他语言出现的错误在javascript中根本不报错

  2. 异步的情况下,try catch可能并不管用。比如下面的代码

    javascript
    try {
    setTimeout(function() {

       do_something_that_throws();
       }, 1000);

    }
    catch (e) {

       alert("You won't see this!");

    }
    因为是异步的,代码运行会跳过try中throw错误的代码,所以就无法捕获错误。

  3. 使用try catch会导致性能问题(重新思考javascript中的try catch

  4. 在nodejs中错误会被传递给回调函数,比如:

    fs.readFile(uri, function (err, fileData) {

       if (err) {
           // handle
           // A. give the error to someone else
           return callback(err)
           // B. recover logic
           return recoverElegantly(err)
           // C. Crash and burn
           throw err
       }
       // success case, handle nicely

    })

什么时候使用try catch呢?

try catch一般用来捕获宿主对象或者ECMAScript抛出的异常。

var json
try {
    json = JSON.parse(input)
} catch (e) {
    // invalid json input, set to null
    json = null
}

参考链接:

  1. try-catch-in-javascript-isnt-it-a-good-practice

简单的说你预计不了的错误你就可以用 try。这里没有绝对的,有一个完善的团队配合的话,不写 try 也是没问题的。

在Java中,如果一段代码可能Throw Exception,那么它的外面就需要包裹try catch。
Js中类似,如果一段代码是第三方的,且会throw exception,最好try一下。判断的方法,可以用dev tool的Exception断点来调试。

主要看你的JS是用来干啥。
如果是负责显示的话 那么JS 要看一下能兼容多少种浏览器。 分别对应写,实在不行就直接丢到一个没啥特校的页面显示说 不支持你的浏览器 BlaBla。。

如果是负责AJAX加载和处理数据。。如果不能兼容的话 就只能直接跳了。。。。

不过一般来说都是负责某些特校不行。。。 一般是用替代品或者跳到错误页 。
替代品可以是 flash ,图片 等等。。

当然是第一种,
你为啥要假装不程序不可控?装模作样抛出异常?
所谓抛出异常,主要目的是为了不让程序死掉,还有完成一些hack。

个人感觉js的异常处理就是个鸡肋,不用也罢。

try catch 必须用在你知道可能发生什么异常的的地方,而且作为直接跟用户打交道的语言,还是不要不友好的直接抛出异常。

当用手机调试的时候,可以用try...catch帮忙定位bug

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏