我遇到了一个未在我的工作流程中捕获的异常的问题。 我有一个由TryCatch包围的自定义AsyncCodeActivity;无论如何,异常没有被捕获,更糟糕的是,托管工作流的IIS池有时会重新启动。 看看这个问题/答案(Exception escapes from workflow despite TryCatch activity),我认为问题在于我重新抛出异常。这就是我经常编写异步代码活动的方法:
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)? 感谢
答案 0 :(得分:1)
我不认为WorkflowApplicationException是由您的代码抛出的。如果某个地方我们以不同方式处理此异常并且不调用TryCatch块,我不会感到惊讶,因为这个异常(及其子类)通常是由工作流运行时引发的,并且不会是如果运行时被冲洗,则在活动中捕获它们。
你可以尝试抛出一个不同的异常,看看是否会产生影响。