@
jmliubiao #6 oh wow 你应该看 #5 的信息,我记错了……
TestController 代码的效果只有无异常的情况下是一样的,考虑 new TsetService() 这个表达式产生异常的情况(比如内存不足,或者构造器抛出异常),那么 Get1Async 会同步得到异常,而 Get2Async 会把异常装进 Task<Student> 里面返回。
Task<int> M1(bool t) { if (t) throw new Exception(); return Task.FromResult(0); }
async Task<int> M2(bool t) { if (t) throw new Exception(); return 1; }
那么
try { M1(); } catch(Exception ex) { Console.WriteLine("caught M1"); }
M2(); Console.WriteLine("M2 succeeded");
的结果是
caught M1
M2 succeeded
因为 M2 的异常只有在 await 的时候才会浮现。但是 #5 说由于这个(异常总是异步的)优点所以应该尽量用 async/await 我就不知道了,我的感觉是最终使用的时候所有 Task 都要被 await ,此时包围之的方法必然是 async ,因此同步异常和异步异常最后都会浮现,时机不同,而且典型的代码里还会掺杂很多其他可能异常的语句,就看细抠异常语义是否有意义吧。