簡體   English   中英

嘗試抓住跳過異常

[英]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.ToListToArray這樣的方法調用GetEnumerator ,因此它們將執行查詢。 MSDN:

ToList<TSource>(IEnumerable<TSource>)方法強制立即查詢評估並返回包含查詢結果的List<T> 您可以將此方法附加到查詢中,以獲取查詢結果的緩存副本。

ToArray<TSource>具有類似的行為,但返回數組而不是List<T>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM