我有下面的代碼位:如何防止.Wait()破壞異常?
private static void Main()
{
AsyncMain().Wait();
}
private static async Task AsyncMain()
{
throw new Exception("Panic!");
}
在這方面,除了將結束沒有顯示在調試器在等待()作爲骨料例外。我怎樣才能讓它出現在拋出異常的地方?
我有下面的代碼位:如何防止.Wait()破壞異常?
private static void Main()
{
AsyncMain().Wait();
}
private static async Task AsyncMain()
{
throw new Exception("Panic!");
}
在這方面,除了將結束沒有顯示在調試器在等待()作爲骨料例外。我怎樣才能讓它出現在拋出異常的地方?
所有異步異常都「捆綁」並拋出爲AggregateException
。你原來的例外只是AggregateException
的內部例外。你可以做如下處理它:
private static void Main()
{
try
{
AsyncMain().Wait();
}
catch (AggregateException aggEx)
{
foreach (Exception ex in taskEx.InnerExceptions)
{
// Handle your original exception here.
}
}
}
的AggregateException
在Wait
時引發的原因是因爲一個異常會僅如果觀察一網打盡!這一點很重要,因爲如果你在上面的例子中沒有使用Wait
,這個例外就不會發生。
如果您需要在AsyncMain
中發現異常,請使用try/catch將其包圍,然後在方法中處理它,否則將始終在觀察時發現它。
如果您有空閒時間,請閱讀Sacha Barber's article series on TPL。絕對精彩。他非常好地解釋了這些概念!
我不想處理我的異常。我已經知道如何做到這一點。我正在尋找的是如何獲得正確的線路中的調試器的例外。 – 2015-02-10 05:38:36
@Layl,請參閱Yuval對您的問題的評論 – 2015-02-10 05:39:18
道歉@Layl,請參閱讚揚的答案。 – 2015-02-10 05:42:01
轉到工具 - >異常 - >公共語言運行時異常並勾選複選框 – 2015-02-10 05:36:47