我有一個關於.NET任務並行庫的錯誤處理的問題。 AggregateException
在哪些情況下會持有多於一個內部異常?我知道這可以發生在前。當調用Task.WaitAll(anArrayOfTasks)
時,有2個或更多任務正在引發異常,但是還有其他情況(即,如果只等待1個任務完成,您會獲得多於1個內部異常)是否可能?什麼時候AggregateException包含多於一個內部異常?
回答
任務可以引發一個聚合異常,它本質上可以包含多個內部異常。這意味着在處理任務時,應始終考慮具有多個內部異常的聚合異常。即使你沒有使用Task.WaitAll,你正在等待的任務可能會在內部等待多個子任務。或者,您等待的任務可能會返回多個異常。你根本無法知道作爲一個來電者。
我同意在一般情況下,你應該假設你可能會得到一個異常列表並設計你的錯誤處理,我只想知道,如果處理一個不依賴於其他異步任務的單獨異步任務將創建一種情況是超過1個例外被通過。 – scripni 2012-03-28 06:42:38
可能,只是可能。雖然這不太可能。如果內部任務等待多個孩子的任務。將創建一個新的AggregateException,其中包含1個包含多個(可能聚合!)內部異常的AggregateException。因此,爲了獲得所有異常並將它們作爲集合來處理它們,總是優先調用AggregateException的Flatten方法 – Polity 2012-03-28 06:44:59
在這種情況下,如何將錯誤傳遞到UI?通常情況下,如果執行某項操作,則可能有兩個結果,即成功或錯誤。設計一個隱式處理錯誤列表的UI在我的看法中似乎令人困惑,並且有兩種情況(一種錯誤,一種錯誤多種)似乎過分複雜。我一直在考慮在UI中最多處理一個異常,並記錄所有異常(並向用戶顯示一條消息以檢查錯誤日誌)。 – scripni 2012-03-28 06:50:27
如果您有一個「父」任務和一個或多個附加到父級的「子」任務,可能會發生這種情況。這意味着只有當所有子任務完成時,父任務纔會完成,並且子任務的異常也會傳播到父任務。
舉個例子,下面的代碼:
var task = Task.Factory.StartNew(
() =>
{
Task.Factory.StartNew(
() => { throw new Exception("inner"); },
TaskCreationOptions.AttachedToParent);
throw new Exception("outer");
});
如果Wait()
這項任務,它thows的AggregateException
,看起來像這樣:
AggregateException
Exception
:外AggregateException
Exception
:內
如果你不喜歡它可以包含內部AggregateException
小號AggregateException
S,你可以使用the Flatten()
method。還有另一種方法可用於處理AggregateException
s:Handle()
。
感謝您的回答,提到Handle()方法的+1,我不知道這一點。 – scripni 2012-03-28 08:25:33
- 1. 獲取AggregateException中包含的實際異常類型
- 2. 混淆什麼時候拋出異常
- 3. ServerSocket.close()。它什麼時候拋出異常?
- 4. 什麼時候拋出java異常
- 5. 什麼時候應該拋出異常?
- 6. 什麼時候包含一個索引(自動啓發式)
- 7. 什麼時候應該創建一個新的異常類
- 8. 什麼時候休眠Session.load()拋出一個異常
- 9. 什麼時候紋理內存應該優於常量內存?
- 10. IOS sythesize - 什麼時候聲明一個內部變量?
- 11. 鑑於什麼時候測試 - 我需要一個「什麼時候」?
- 12. 爲什麼常量x是OK的時候多包括它
- 13. Java部署工具包 - 什麼時候安裝內聯?
- 14. 等待異步任務,但沒有在AggregateException中包裝異常
- 15. 使用什麼異常類中時的IEnumerable包含null
- 16. 什麼時候包括什麼?
- 17. 什麼時候你返回一個類,你什麼時候返回一個HttpResponseMessage?
- 18. NullPointerException異常對包括佈局部按壓的時候
- 19. 什麼時候變量是閉包的一部分?
- 20. 什麼時候|不等於|?
- 21. 當我拋出一個異常時,內存發生了什麼?
- 22. 什麼時候返回布爾,拋出一個異常和拋出哪個異常
- 23. 在什麼時候都異常使用Django的ORM時提出
- 24. 什麼時候Java Collections在使用Collections.addAll()時拋出NullPointerException異常
- 25. 什麼時候閃避異常和何時處理它們
- 26. C#多態 - 爲什麼&什麼時候
- 27. 什麼時候有一個實例可以在單個html文檔中包含多個相同元素ID?
- 28. 什麼時候應該在方法中拋出異常或捕獲異常?
- 29. currentDesign.writeCssincludes包含什麼內容?
- 30. system.in包含什麼內容?
與Parallel Library無關。假設你有一個方法來刪除文件列表,但有一些被鎖定。您可以使用'AggregateException'爲鎖定的文件重新拋出並繼續刪除其餘文件。 – nalply 2013-09-19 08:39:07