/// <summary>
        /// Exception occurs.
        /// </summary>
        protected void OnException
        (
            [NotNull] ExecutionContext context
        )
        {
            Sure.NotNull(context, nameof(context));
            Log.Trace(nameof(AbstractEngine) + "::" + nameof(OnException));

            // TODO Implement properly!

            if (context.Exception is ArsMagnaException exception &&
                context.Connection is IrbisConnection connection)
            {
                if (!ReferenceEquals(connection.RawClientRequest, null))
                {
                    BinaryAttachment request = new BinaryAttachment
                                               (
                        "request",
                        connection.RawClientRequest
                                               );
                    exception.Attach(request);
                }

                if (!ReferenceEquals(connection.RawServerResponse, null))
                {
                    BinaryAttachment response = new BinaryAttachment
                                                (
                        "response",
                        connection.RawServerResponse
                                                );
                    exception.Attach(response);
                }
            }

            ExceptionOccurs?.Invoke(this, new ExecutionEventArgs(context));
        }
Beispiel #2
0
        private void _Resolve
        (
            int count,
            Exception ex
        )
        {
            Log.Error
            (
                "RetryManager::_Resolve: "
                + "catch exception: "
                + ex.GetType().Name
                + ": "
                + ex.Message
                + ", count="
                + count
            );

            if (count >= RetryLimit)
            {
                Log.Error
                (
                    "RetryManager::_Resolve: "
                    + "count exceeded limit="
                    + RetryLimit
                );

                throw ex;
            }

            ExceptionEventArgs eventArgs
                = new ExceptionEventArgs(ex);

            ExceptionOccurs.Raise(this, eventArgs);

            if (ReferenceEquals(_resolver, null))
            {
                return;
            }

            bool result = _resolver(ex);

            if (!result)
            {
                Log.Error
                (
                    "RetryManager::_Resolve: "
                    + "couldn't resolve: "
                    + ex.GetType().Name
                );

                throw new ArsMagnaException
                      (
                          "RetryManager failed",
                          ex
                      );
            }

            Resolved.Raise(this);

            _Delay();
        }