comparison Implab/AbstractEvent.cs @ 186:75103928da09 ref20160224

working on cancelation and error handling
author cin
date Tue, 19 Apr 2016 00:50:14 +0300
parents 822aab37b107
children d6fe09f5592c
comparison
equal deleted inserted replaced
185:822aab37b107 186:75103928da09
75 /// будут проигнорированы. 75 /// будут проигнорированы.
76 /// </remarks> 76 /// </remarks>
77 /// <param name="error">Исключение возникшее при выполнении операции</param> 77 /// <param name="error">Исключение возникшее при выполнении операции</param>
78 /// <exception cref="InvalidOperationException">Данное обещание уже выполнено</exception> 78 /// <exception cref="InvalidOperationException">Данное обещание уже выполнено</exception>
79 protected void SetError(Exception error) { 79 protected void SetError(Exception error) {
80 while (error is PromiseTransientException)
81 error = error.InnerException;
82
83 var isCancel = error is OperationCanceledException;
84
85 if (BeginTransit()) { 80 if (BeginTransit()) {
86 m_error = isCancel ? error.InnerException : error; 81 m_error = error;
87 CompleteTransit(isCancel ? CANCELLED_STATE : REJECTED_STATE); 82 CompleteTransit(REJECTED_STATE);
88 83
89 Signal(); 84 Signal();
90 } else { 85 } else {
91 WaitTransition(); 86 WaitTransition();
92 if (!isCancel || m_state == SUCCEEDED_STATE) 87 if (m_state == SUCCEEDED_STATE)
93 throw new InvalidOperationException("The promise is already resolved"); 88 throw new InvalidOperationException("The promise is already resolved");
94 } 89 }
95 } 90 }
96 91
97 /// <summary> 92 /// <summary>
138 133
139 switch (m_state) { 134 switch (m_state) {
140 case SUCCEEDED_STATE: 135 case SUCCEEDED_STATE:
141 return; 136 return;
142 case CANCELLED_STATE: 137 case CANCELLED_STATE:
143 throw new OperationCanceledException(); 138 throw new OperationCanceledException("The operation has been cancelled", m_error);
144 case REJECTED_STATE: 139 case REJECTED_STATE:
145 throw new TargetInvocationException(m_error); 140 throw new TargetInvocationException(m_error);
146 default: 141 default:
147 throw new ApplicationException(String.Format("Invalid promise state {0}", m_state)); 142 throw new ApplicationException(String.Format("The promise state {0} is invalid", m_state));
148 } 143 }
149 } 144 }
150 #endregion 145 #endregion
151 146
152 #region handlers managment 147 #region handlers managment