我正在学习在Windows窗体应用程序中使用async / await,尝试在执行慢动作时保持我的Windows应用程序响应。我看到抛出异常的处理有所不同。
如果我使用WebClient.DownloadStringTaskAsync,我的代码会捕获异常:
private async void button1_Click(object sender, EventArgs e)
{
try
{
this.textBox1.Text = await webClient.DownloadStringTaskAsync("invalid address");
}
catch (Exception exc)
{
textBox1.Text = exc.Message;
}
}
但是,如果我在自己的代码中调用异步函数,则不会捕获异常:
private string GetText()
{
throw new Exception("Tough luck!");
}
private async void button3_Click(object sender, EventArgs e)
{
using (var webClient = new WebClient())
{
try
{
this.textBox1.Text = await Task.Run(() => GetText());
}
catch (Exception exc)
{
textBox1.Text = exc.Message;
}
}
}
作为stackoverflow问题Correct Way to Throw and Catch Exceptions using async/await的答案,有人建议“禁用'我的代码' 工具 - >选项 - > Debugging->常规“
在Daniel Hilgarth的评论之后(感谢Daniel!),我看到了一个复制粘贴错误。我在这里纠正了它。问题仍然存在,但如果您按照建议禁用“仅我的代码”,则会正确捕获异常。
所以我猜问题已经解决了。
答案 0 :(得分:3)
问题在于:
您正在投掷Exception
但正在抓WebException
。
两种解决方案:
WebException
Exception
首选解决方案1是因为您实际上不应该抛出非特定的Exception
。
答案 1 :(得分:1)
您投掷的是Exception
类型,但只捕获更具体的WebException
。捕获WebException
只会捕获WebException
类型的异常或从中派生的类型。