Queue <ExpressionBuilder> DoAdd(WorkflowRuntimeException value)
        {
            var key = value.InnerException;

            if (key != null)
            {
                var nestedKey = key as WorkflowRuntimeException;
                if (nestedKey != null)
                {
                    var callStack = DoAdd(nestedKey);
                    if (callStack != null)
                    {
                        callStack.Enqueue(value.Builder);
                        return(callStack);
                    }
                }
                else
                {
                    var weakKey = new WeakKey <Exception>(key);
                    if (exceptions.ContainsKey(weakKey))
                    {
                        return(null);
                    }
                    CollectUnusedExceptions();

                    var callStack = new Queue <ExpressionBuilder>();
                    callStack.Enqueue(value.Builder);
                    exceptions.Add(weakKey, callStack);
                    return(callStack);
                }
            }

            return(null);
        }
        public bool TryAdd(WorkflowRuntimeException value)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            return(DoAdd(value) != null);
        }
Example #3
0
        public bool TryGetValue(Exception key, out WorkflowException value)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            value = null;
            var weakKey = new WeakKey <Exception>(key);
            var result  = exceptions.TryGetValue(weakKey, out Queue <ExpressionBuilder> callStack);

            if (result)
            {
                while (callStack.Count > 0)
                {
                    var builder = callStack.Dequeue();
                    value = new WorkflowRuntimeException(key.Message, builder, value ?? key);
                }
            }

            return(result);
        }