这让我困扰了一段时间。我在断言失败时抛出一个异常,但这只有在我能真正捕获异常时才有用(在这种情况下我提醒
用户)。如果我不能捕获异常,那么
- 我依靠浏览器通知用户出现了内部错误(浏览器可能什么都不做,所以用户永远不会发现有问题),并且
- 我没有得到检查,所以无法清理。
那么,JavaScript 中真的有处理断言错误的好方法吗?有没有办法捕获未捕获的异常?请注意,我对单元测试、用户错误等不感兴趣 - 我只关心契约(Contract)编程,用户和开发人员都需要知道出现了错误。
最佳答案
对于断言,有console.assert()
.但这只会记录消息并继续。
使用 HTML5 还可以使用 window.onerror
捕获未处理的异常处理程序。有一个 excellent article on dev.opera如何使用它向用户显示花哨的错误消息,甚至将异常记录到服务器。
如果您不能使用它,那么您只能在所有内容(尤其是“执行入口点”,如事件处理程序、超时等)周围使用 try-catch-clauses。或者您可以在抛出错误之前处理错误:
function SmartError(message) {
Error.call(this, message);
$('<div class="error">Some problem occured, the app will stop working</div>')
.appendTo("body");
$.post("/log/clientside/js.php", this);
...
}
if (something.does(! "work"))
throw new SmartError("mysterious problem");
关于JavaScript 契约和断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10915146/