public string GetString() { Thread.Sleep(3000); int s = int.Parse("ab");//抛出异常 return s.ToString(); } public Task<string> GetStringAsync() { return Task.Run<string>(() => { return GetString(); }); } public async Task<ActionResult> TaskDemo() { string result = ""; try { Task<string> task = GetStringAsync(); result = await task; } catch (AggregateException ex) { foreach (Exception inner in ex.InnerExceptions) { result += string.Format("Exception type {0} from {1}", inner.GetType(), inner.Source); } } return View(result); }
为什么GetString方法中的异常不能被捕获,异步方法中的异常应该如何捕获,上述例子如何进行异常捕获呢?
http://blog.zhaojie.me/2012/04/exception-handling-in-csharp-async-await-1.html
大神,这篇文章我看了,可是看的有点糊涂啊!
针对我这个具体情况,如何进行捕获呢,我的方法的问题在哪呢?
task.Exception
大神,能不能具体点,我对异步不是很熟,刚开始研究,能不能针对我上面的方法,具体如何修改呢?
用 await 的调用产生异常不是AggregateException,而是你原始的异常,你捕获错异常类型了,用Exception或FormatException都能捕获到的。
Task中对于没有捕获的异常,像你这段代码中的,是不会导致程序终止的,用TaskScheduler.UnobservedTaskException可以查看到(要触发GC的时候才能有该事件)。
将 public string GetString() 改为 async 方法:
public static async Task<string> GetString() { Thread.Sleep(3000); int s = int.Parse("ab");//抛出异常 return s.ToString(); }
将 catch (AggregateException ex) 改为 catch (Exception ex) 就能捕获到异常了。