问题描述
我有下面的例子:(也请阅读code的意见,因为它会更有意义)
公共异步任务<任务<结果>> MyAsyncMethod()
{
任务<结果> resultTask =等待_mySender.PostAsync();
返回resultTask; //在现实生活中的案例这将返回到一个不同的组件,我不能改变
//但我需要做的在这里的一些结果异常处理
}
让我们假设_的 PostAsync
方法 mySender
是这样的:
公共任务<任务<结果>> PostAsync()
{
任务<结果>结果= GetSomeTask();
返回结果;
}
现在的问题是:
由于我不期待实际结果
在 MyAsyncMethod
,如果 PostAsync
方法抛出一个异常,其中上下文是异常将被引发和处理?
和
有什么办法,我可以处理我的装配异常?
我很惊讶,当我试图改变 MyAsyncMethod
来:
公共异步任务<任务<结果>> MyAsyncMethod()
{
尝试
{
任务<结果> resultTask =等待_mySender.PostAsync();
返回resultTask;
}
赶上(MyCustomException前)
{
}
}
异常被抓到这里来,事件是否有实际的结果没有游览车。它发生 PostAsync
的结果已经可以和异常是在这种情况下正确抛出?
时有可能使用 ContinueWith
来处理当前类的异常?例如:
公共异步任务<任务<结果>> MyAsyncMethod()
{
任务<结果> resultTask =等待_mySender.PostAsync();
VAR exceptionHandlingTask = resultTask.ContinueWith(T => {手柄(t.Exception)},TaskContinuationOptions.OnlyOnFaulted);
返回resultTask;
}
这是一个很大的问题,打包成一个问题,但OK ......
Unobserved Task exceptions are raised by the TaskScheduler.UnobservedTaskException
event. This event is raised "eventually" because the Task must actually be garbage collected before its exception is considered unhandled.
Any method that uses the async
modifier and returns a Task
will put all of its exceptions on that returned Task
.
Yes, you could replace the returned task, something like:
async Task<Result> HandleExceptionsAsync(Task<Result> original)
{
try
{
return await original;
}
catch ...
}
public async Task<Task<Result>> MyAsyncMethod()
{
Task<Result> resultTask = await _mySender.PostAsync();
return HandleExceptionsAsync(resultTask);
}
That actually means that the method you're calling is not async Task
, as your code example shows. It's a non-async
, Task
-returning method, and when one of those methods throws an exception, it's treated just like any other exception (i.e., it passes directly up the call stack; it's not placed on the returned Task
).
Yes, but await
is cleaner.
这篇关于哪里如果不是等待一个异步任务抛出异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!