我正在通过使用 async/await 模式来解决(似乎如此)非常著名的异常处理问题。具体来说,我的上下文是在 HTTP 客户端上,但我也尝试过更简单的测试,它的行为相同。
考虑下面的程序,它是我原始应用程序上下文的超级简化版本。
class Program
{
static void Main(string[] args)
{
Test();
Console.Write("Press any key...");
Console.ReadKey();
Console.WriteLine();
}
static async void Test()
{
var c = new MyClient();
try
{
var uri = new Uri("http://www.google.com/"); //valid address
var s = await c.GetString(uri);
Console.WriteLine(s.Length);
}
catch (WebException ex)
{
Console.WriteLine(ex.Message);
}
try
{
var uri = new Uri("http://www.foo.bah/"); //non-existent address
var s = await c.GetString(uri);
Console.WriteLine(s.Length);
}
catch (WebException ex)
{
Console.WriteLine(ex.Message);
}
}
}
class MyClient
{
public async Task<string> GetString(Uri uri)
{
var client = new HttpClient();
return await client.GetStringAsync(uri);
}
}
当程序启动时,它将第一个网站的页面作为字符串下载,然后显示其长度:这很好。之后,当对无效地址执行相同的操作时,客户端会引发 WebException(这就是我想要的),但它没有被捕获。
更新:作为“未捕获”,我的意思是代码实际上没有流经“捕获”分支并静默显示异常消息。相反,VS IDE 显示异常,并且调试中断。
捕捉异常的任何体面的解决方案?
提前谢谢了。