我正在尝试更熟悉异步/等待编程和异常处理。
static void Main(string[] args)
{
TestAsyncException();
}
private static async void TestAsyncException()
{
try
{
var result = await Task.Factory.StartNew(() => DoSomething());
//do something with the result
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
private static int DoSomething()
{
throw new Exception("Exception was thrown!");
}
我希望Exception
可以优雅地处理,但代码执行会停止,我会得到
在..中发生了'System.Exception'类型的异常,但却没有 用户代码处理。
但是当我继续执行代码时,Exception
实际上被捕获(并且消息显示在Console
)。
如何在不中断代码执行的情况下抓住Exception
?
答案 0 :(得分:4)
首先,处理您的异常。我相信您看到代码停止执行并显示错误,因为您有异常Break When Thrown
。检查您的例外窗口(Debug -> Windows -> Exception Settings
)。
当您在void
方法上使用返回类型async
时,您无法从该方法中获取任何类型的信息 - 它会被发射并忘记。除了在特定情况下,这是不好的做法。始终让异步方法返回Task
或Task<T>
:
private static async Task TestAsyncException()
现在,您的主要方法可以听取任务:
static void Main(string[] args)
{
TestAsyncException().Wait(); // or whatever you want to do with the task
Console.Read();
}
通常,您可以使用await
在此处解包任务,但在应用程序入口点中不允许这样做。