2012-08-16 60 views
0

我遇到了未在我的工作流程中发现的异常问题。 我有一个由TryCatch包围的自定义AsyncCodeActivity;无论如何,这个异常没有被捕获,更糟糕的是,我的IIS池托管工作流有时会重新启动。 看着这个问题/答案(Exception escapes from workflow despite TryCatch activity),我认为问题在于我重新抛出异常的方式。这是我通常写异步代码活动的方式:我应该如何处理AsyncCodeActivity中的异常?

protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) 
    { 
     Action<object> execute = s => this.Execute(); 
     var task = new Task(execute, state, CancellationToken.None, TaskCreationOptions.PreferFairness); 
     task.ContinueWith(s => callback(s)); 
     task.Start(); 
     return task; 
    } 

    protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result) 
    { 
     var task = result as Task; 
     Contract.Assert(task != null); 
     if (task.IsFaulted && task.Exception != null) 
     { 
      Contract.Assert(
       task.Exception.InnerException != null, 
       "It is expected that the inner exception in a task is not null"); 
      const string Message = "An exception was thrown while doing something"; 
      Logger.ErrorException(Message, task.Exception.InnerException); 
      throw new WorkflowApplicationException(Message, task.Exception.InnerException); 
     } 
    } 

    private void Execute() 
    { 
     // Do something here 
    } 

它是在异步代码活动中处理异常的正确方法吗?如果是的话,我应该如何防止我的工作流程中止(有时重新启动IIS)? 谢谢

回答

1

我不认为WorkflowApplicationException是由您的代码抛出。如果我们以不同的方式处理此异常并且不调用TryCatch块,我不会感到惊讶,因为此异常(及其子类)通常由工作流运行时抛出,并且在活动中不会捕获它们运行时间被破坏。

你可以尝试抛出一个不同的异常,看看是否有所作为。

+0

感谢Ron,我将改变WorkflowApplicationException与自定义异常。无论如何,这个问题也可能与CodeContract断言有关,因为在Windows日志中,我发现堆栈错误在System.Diagnostics.Contracts.Internal.ContractHelper.TriggerFailureImplementation上以System.Environment.FailFast(System.String) 终止(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.String,System.Exception) at System.Diagnostics.Contracts.Contract.ReportFailure(... – fra 2012-08-17 05:24:52

+0

问题在于触发器中的另一个活动这是一个例外 无论如何,这个答案有助于解决可能的错误,所以我把它设置为正确的,谢谢。 – fra 2012-08-18 13:26:12