anchor.diff:  
     bool visitTryStatement(ast.TryStatement node) {
       var result = visit(node.body);
  -    if (node.catchClauses.isNotEmpty) {
  -      if (node.catchClauses.length != 1) {
  -        throw 'Analysis: unimplemented(TryStatement)';
  -      }
  -      if (visit(node.catchClauses.first)) result = true;
  +    for (var clause in node.catchClauses) {
  +      if (visit(clause)) result = true;
       }
       if (node.finallyBlock != null) {
         if (visit(node.finallyBlock)) result = true;
  
positive.code:             AstFactory.functionExpressionInvocation(
                  identifier(finallyContName), [])));
        });
        breakTargets = breakTargets.map(newJumpTarget).toList();
        continueTargets = continueTargets.map(newJumpTarget).toList();
      }
  
      var exnName, catchBlock;
      if (node.catchClauses.isNotEmpty) {
        assert(node.catchClauses.length == 1);
        exnName = node.catchClauses.first.exceptionParameter.name;
        catchBlock = currentBlock = emptyBlock();
        visit(node.catchClauses.first)((e) {
          if (finallyBlock != null) {
            addStatement(
                AstFactory.returnStatement2(
                    functionExpression([], applyExpressionCont(f, e))));
          } else {
            f(e);
          }
        }, (v) {
          if (finallyBlock != null) {
            addStatement(
                AstFactory.returnStatement2(
                    functionExpression([], applyExpressionCont(r, v))));
          } else {
            r(v);
          }
        }, () {
          if (finallyBlock != null) {
            addStatement(
                AstFactory.returnStatement2(identifier(joinName)));
          } else {
            addStatement(
                AstFactory.returnStatement2(
                    AstFactory.functionExpressionInvocation(
                        identifier(joinName), [])));
          }
        });
      }
  
      var tryBlock = currentBlock = emptyBlock();
      visit(node.body)((e) {
        addStatement(AstFactory.throwExpression2(e));
      }, (v) {
        if (finallyBlock != null) {
          addStatement(
              AstFactory.returnStatement2(
                  functionExpression([], applyExpressionCont(r, v))));
        } else {
          r(v);
        }
      }, () {
        if (finallyBlock != null) {
          addStatement(
              AstFactory.returnStatement2(identifier(joinName)));
        } else {
          addStatement(
              AstFactory.returnStatement2(
                  AstFactory.functionExpressionInvocation(
                      identifier(joinName), [])));
        }
      });
  
      currentBlock = savedBlock;
      breakTargets = savedBreakTargets;
  
negative.code:         AstFactory.typeName3(
              AstFactory.identifier5('Future', 'sync'), []),
          [functionExpression([], tryBlock)]);
      for (var args in catchErrorArgs) {
        expr = AstFactory.methodInvocation(expr, 'catchError', args);
      }
      if (finallyBlock != null) {
        var name = newName('e');
  