JavaScript 契约和断言

标签 javascript assert design-by-contract

这让我困扰了一段时间。我在断言失败时抛出一个异常,但这只有在我能真正捕获异常时才有用(在这种情况下我提醒用户)。如果我不能捕获异常,那么

  1. 我依靠浏览器通知用户出现了内部错误(浏览器可能什么都不做,所以用户永远不会发现有问题),并且
  2. 我没有得到检查,所以无法清理。

那么,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/

相关文章:

javascript - DAO 与 ORM - 在 Sequelize.js 的上下文中解释的概念

javascript - document.getElementById ("").style.display ='none' ;不管用

javascript - 将内联 JavaScript 放在头部

c++ - 如何编写自定义断言?

java - 契约(Contract)设计中哪些先决条件是合理的?

javascript - Electron.js 应用程序在一个小时未使用后卡住

python - 如何在Python中使用assert和==?

java - 我们可以在 testNG 中处理 try 和 catch 中的断言失败吗

OOP:实现具有更广泛签名的接口(interface)方法

c++ - 非 C++ OOP 语言中的 header