diff --git a/red/runtime/nodes/Node.js b/red/runtime/nodes/Node.js index cbe954a67..9d9f4753d 100644 --- a/red/runtime/nodes/Node.js +++ b/red/runtime/nodes/Node.js @@ -243,10 +243,12 @@ Node.prototype.error = function(logMessage,msg) { if (typeof logMessage != 'boolean') { logMessage = logMessage || ""; } - log_helper(this, Log.ERROR, logMessage); - /* istanbul ignore else */ + var handled = false; if (msg) { - flows.handleError(this,logMessage,msg); + handled = flows.handleError(this,logMessage,msg); + } + if (!handled) { + log_helper(this, Log.ERROR, logMessage); } }; diff --git a/red/runtime/nodes/flows/Flow.js b/red/runtime/nodes/flows/Flow.js index ae7c8cc68..eace8cbe9 100644 --- a/red/runtime/nodes/flows/Flow.js +++ b/red/runtime/nodes/flows/Flow.js @@ -221,7 +221,7 @@ function Flow(global,flow) { count = msg.error.source.count+1; if (count === 10) { node.warn(Log._("nodes.flow.error-loop")); - return; + return false; } } } @@ -265,6 +265,7 @@ function Flow(global,flow) { throwingNode = activeNodes[throwingNode.z]; } } + return handled; } } diff --git a/red/runtime/nodes/flows/index.js b/red/runtime/nodes/flows/index.js index 38fcbd499..9a8fb937b 100644 --- a/red/runtime/nodes/flows/index.js +++ b/red/runtime/nodes/flows/index.js @@ -174,27 +174,31 @@ function getFlows() { } function delegateError(node,logMessage,msg) { + var handled = false; if (activeFlows[node.z]) { - activeFlows[node.z].handleError(node,logMessage,msg); + handled = activeFlows[node.z].handleError(node,logMessage,msg); } else if (activeNodesToFlow[node.z] && activeFlows[activeNodesToFlow[node.z]]) { - activeFlows[activeNodesToFlow[node.z]].handleError(node,logMessage,msg); + handled = activeFlows[activeNodesToFlow[node.z]].handleError(node,logMessage,msg); } else if (activeFlowConfig.subflows[node.z] && subflowInstanceNodeMap[node.id]) { subflowInstanceNodeMap[node.id].forEach(function(n) { - delegateError(getNode(n),logMessage,msg); + handled = handled || delegateError(getNode(n),logMessage,msg); }); } + return handled; } function handleError(node,logMessage,msg) { + var handled = false; if (node.z) { - delegateError(node,logMessage,msg); + handled = delegateError(node,logMessage,msg); } else { if (activeFlowConfig.configs[node.id]) { activeFlowConfig.configs[node.id]._users.forEach(function(id) { var userNode = activeFlowConfig.allNodes[id]; - delegateError(userNode,logMessage,msg); + handled = handled || delegateError(userNode,logMessage,msg); }) } } + return handled; } function delegateStatus(node,statusMessage) {