private void HandleException(FailedAction failedAction, Exception exception) { if (exception is TestflowLoopBreakException) { throw exception; } switch (failedAction) { // 如果失败行为是终止,则抛出异常 case FailedAction.Terminate: throw exception; break; // 如果失败行为是继续,则不执行任何操作 case FailedAction.Continue: break; // 如果失败行为是跳出循环,则抛出LoopBreakException case FailedAction.BreakLoop: throw new TestflowLoopBreakException(true, exception); break; // 如果失败行为是下一个循环,则抛出LoopBreakException case FailedAction.NextLoop: throw new TestflowLoopBreakException(false, exception); break; } }
private void FailCommand(NetworkMessage message) { if (message.TryGetObject <ResponseCodes>(out ResponseCodes code)) { FailedAction?.Invoke(code); } }
// 使能retry调用step,且失败后强制继续执行 private void InvokeStepWithRetryAndForceContinue(bool forceInvoke) { try { InvokeStepWithRetry(forceInvoke); } catch (TaskFailedException ex) { // 如果该失败类型不能被处理,则直接抛出 if (!ModuleUtils.IsErrorCanBeHandled(ex.FailedType)) { throw; } // 停止计时 Actuator.EndTiming(); this.Result = ModuleUtils.GetStepResult(ex.FailedType); // 如果InvokeErrorAction不是Continue,则抛出异常 RecordInvocationError(ex, ex.FailedType); HandleException(StepData.InvokeErrorAction, ex); } catch (TestflowAssertException ex) { // 停止计时 Actuator.EndTiming(); this.Result = StepResult.Failed; RecordInvocationError(ex, FailedType.AssertionFailed); HandleException(StepData.AssertFailedAction, ex); } catch (TargetInvocationException ex) { // 停止计时 Actuator.EndTiming(); this.Result = StepResult.Error; RecordTargetInvocationError(ex); // 如果失败行为是终止,则抛出异常 FailedAction failedAction = ex.InnerException is TestflowAssertException ? StepData.AssertFailedAction : StepData.InvokeErrorAction; HandleException(failedAction, ex.InnerException); } catch (TargetException ex) { // 停止计时 Actuator.EndTiming(); this.Result = StepResult.Error; RecordInvocationError(ex, FailedType.TargetError); HandleException(StepData.InvokeErrorAction, ex); } }
public override int GetHashCode() { var un = Name; un += Matcher.ToString(); un += string.Join("", Conditions.Select(s => s.Left + s.Right + s.Right)); un += Online.ToString(); un += Action.ToString(); un += FailedAction.ToString(); un += CustomCodeName; un += Url; un += HttpCode; return(Lib.Security.Hash.ComputeIntCaseSensitive(un)); }
// 执行step,即使失败也继续执行,如果失败,写入runtimeStatus private void InvokeStepAndForceContinue(bool forceInvoke) { try { InvokeStepSingleTime(forceInvoke); } catch (TaskFailedException ex) { // 如果该失败类型不能被处理,则直接抛出 if (!ModuleUtils.IsErrorCanBeHandled(ex.FailedType)) { throw; } // 停止计时 Actuator.EndTiming(); this.Result = _isUnderRetryStep ? StepResult.RetryFailed : StepResult.Failed; RecordInvocationError(ex, ex.FailedType); HandleException(StepData.InvokeErrorAction, ex); } catch (TestflowAssertException ex) { // 停止计时 Actuator.EndTiming(); this.Result = _isUnderRetryStep ? StepResult.RetryFailed : StepResult.Failed; RecordInvocationError(ex, FailedType.AssertionFailed); HandleException(StepData.AssertFailedAction, ex); } catch (TargetInvocationException ex) { // 停止计时 Actuator.EndTiming(); RecordTargetInvocationError(ex); FailedAction failedAction = ex.InnerException is TestflowAssertException ? StepData.AssertFailedAction : StepData.InvokeErrorAction; HandleException(failedAction, ex.InnerException); } catch (TestflowLoopBreakException ex) { // 停止计时 Actuator.EndTiming(); if (null != ex.InnerException) { FailedType failedType = GetFailedType(ex.InnerException); RecordInvocationError(ex, failedType); HandleException(StepData.AssertFailedAction, ex); } else { throw; } } catch (TargetException ex) { // 停止计时 Actuator.EndTiming(); this.Result = StepResult.Error; RecordInvocationError(ex, FailedType.TargetError); HandleException(StepData.InvokeErrorAction, ex); } }