![](/img/trans.png)
[英]btnSubmit_Click skipping try and going straight to catch (Exception ex)
[英]try catch skipping exception
try
{
return strngarray.Select(strngarrayelem =>
{
string[] data = strngarrayelem .Split(',');
return new xyzClass(data[1], data[2], data[0], (Color)System.Windows.Media.ColorConverter.ConvertFromString(data[3]), data.Length > 4 ? data[4] : "N/A");
});
}
catch (Exception ex)
{
MessageBox.Show("abc");
return Enumerable.Empty<xyzClass>();
}
我正在獲得格式異常
(Color)System.Windows.Media.ColorConverter.ConvertFromString(data[3])
我嘗試通過try-catch捕獲它,但異常仍然被應用程序級別的try catch拋出而沒有被我的本地try catch捕獲。 為什么我的嘗試沒有收到錯誤?
您只是返回一個LINQ查詢,它尚未執行(例如使用ToList
)。
因此,如果您想在此處捕獲異常,則應考慮將其實現為此方法中的集合。 您仍然可以返回IEnumerable<xyzClass>
因為List<xyzClass>
實現了該接口。
try
{
return strngarray.Select(strngarrayelem =>
{
string[] data = strngarrayelem .Split(',');
return new xyzClass(data[1], data[2], data[0], (Color)System.Windows.Media.ColorConverter.ConvertFromString(data[3]), data.Length > 4 ? data[4] : "N/A");
}).ToList(); // <------- HERE !!!
}
catch (Exception ex)
{
MessageBox.Show("abc");
return Enumerable.Empty<xyzClass>();
}
如果您不知道哪個方法只返回查詢,請查看MSDN中關於deferred
關鍵字的文檔。 例如Enumerable.Select
:
此方法通過使用延遲執行來實現。 立即返回值是一個對象,它存儲執行操作所需的所有信息。 直到通過直接調用其
GetEnumerator
方法或使用foreach
枚舉對象,才會執行此方法表示的查詢
像Enumerable.ToList
或ToArray
這樣的方法調用GetEnumerator
,因此它們將執行查詢。 MSDN:
ToList<TSource>(IEnumerable<TSource>)
方法強制立即查詢評估並返回包含查詢結果的List<T>
。 您可以將此方法附加到查詢中,以獲取查詢結果的緩存副本。
ToArray<TSource>
具有類似的行為,但返回數組而不是List<T>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.