先上代码:
using System; using System.Threading.Tasks; public class Program { public static void Main() { Task task = Task.Run(() => { throw new InvalidOperationException(); }); try { task.Wait(); } catch(AggregateException exception) { exception.Handle(eachException => { Console.WriteLine( "ERROR: {0}", eachException.Message); return true; }); } } }
提问:这段代码我在vs2013中可以正常运行并且进入到catch块中的异常处理,最终会显示错误的字符串,但是同样这段代码,我在vs2017中运行测试会直接弹出异常,求解!!!
接楼上的。 把catch (AggregateException e) 换成 catch(Exception e)
在vs2017中无论是运行.net core的console还是.net framework 的console都会提示这个
我理解的是能在catch中捕获并显示一些错误的信息
@wall-ee:
try{
Task task=new Task().....
task.wait()
}catch(exception)
可好?
@czd890: 没有解决。task没有start的话wait他干嘛?
@wall-ee: Task.Run 不久自动start了啊。
调试模式。catch加个断点。在按个F5.
@czd890: task.run的话还用new task干嘛?新手不懂,万望谅解
@czd890: 我试试
@wall-ee: new 出来的task 是没有启动的。可以你代码控制随时start。
。run出来的,自动加入任务池等待执行了。
@czd890:
@czd890: task.Wait();这句就抛出异常了啊。。
@wall-ee: 你在你的Console.WriteLine 上面放个断点。出现你上面截图的样子的时候,在按个F5
设置完了。就自动跳了
@czd890: 再按F5能在console里面显示错误,但在vs2013中是会被catch块直接捕获并处理错误的。vs2017为什么是这样的呢?
@wall-ee: 参考上一个回复截图
@czd890: 谢谢,明白了。
你把上面的run也放进try里就行了
throw的时候这边不一定wait()已经执行了.
try { Task task=Task.Run(()=> { throw new InvalidOperationException(); }); } catch (AggregateException e) { e.Handle(eachException => { Console.WriteLine(eachException.Message); return true; }); }
这样也不行,问题还是在于我用vs2013和vs2017运行同一段代码得出的结果不一样。求解
哦上面的代码少了task.Wait();实际上是有的。
@wall-ee: 一个能进catch.一个不能进?
@吴瑞祥: 是的,一个能进catch(vs2013),一个直接抛出异常(vs2017)
@wall-ee: 你catch(Exception exception)试试
@吴瑞祥: 还是不行,您有空的话在vs2017上面帮我看一下,谢谢
上面写的都是没问题的,你的vs2103和vs2017也是没有问题的,按照你说的vs2013和vs2017只是针对你项目中的错误处理方式不同,应该是2013里面让你自己的try catch去处理而vs2017它监测到走到了异常位置选择停下来让开发者可以快速知道已经到了异常位置了,如果这个时候你继续执行 按下F10 它应该会走到catch代码块中