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