Restartable error handling system


cond is hosted at Github. mona is a public domain work, dedicated using CC0 1.0. Feel free to do whatever you want with it.


$ npm install cond or $ bower install cond

Execute the following in a browser session, with developer tools open, and follow the instructions:

var availableFlavors = ["chocolate", "vanilla", "mint chocolate chip"];
function getIceCream(flavor) {
    if (availableFlavors.indexOf(flavor) !== -1) {
        return flavor + " ice cream ゲットー!";
    } else {
        // Just like throw new Error("something"), but we provide a way 
        // the user can recover from it. 
        return cond.error("Sorry, that flavor is not available", [
            "different-flavor", "Try a different flavor", getIceCream
        ], [
            "add-flavor", "Add this flavor to available ones and retry", function() {
                return getIceCream(flavor);
console.log("I really like this flavor!");
// In the console, do: 
// > showRecoveries(); 
// > recover(0, "chocolate"); 
// You can also access recoveries programmatically: 
console.log(cond.handlerBind(function() {
    return getIceCream("bubblegum");
}, [Error, function(e) { return cond.recover("add-flavor"); }]));


cond is a JavaScript implementation of Common Lisp's condition system, a system for handling errors and other conditions of interest that handles signals at the call site, before the stack is unwound -- allowing you to repair or alter what happens at the callsite, and continuing executing as if nothing had been signaled/thrown.