我正在通過使用async/await模式來處理異常處理(似乎是如此)非常着名的問題。具體而言,我的上下文位於HTTP客戶端上,但我也嘗試過更簡單的測試,並且其行爲相同。異步/等待和WebException處理
考慮下面的程序,這是我的原始應用程序的上下文的超簡化版本。
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(這正是我想要的),但它沒有被捕獲。
更新:作爲「未捕獲」,我的意思是代碼實際上不會流經「catch」分支並以靜默方式顯示異常消息。相反,VS IDE顯示異常,調試中斷。
任何體面的解決方案來捕捉異常?
非常感謝提前。
目前您提供甚至不會編譯代碼 - 你必須申報'MyClient.GetString'返回任務''代替Task'的'。你也沒有告訴我們究竟發生了什麼。 –
也許你已經將調試器設置爲「打破所有異常」,並且只是認爲它沒有被捕獲? – usr
可能的解決方案:註冊域並在其上放置一些網站。 – usr