2014-10-09 63 views
0

嗨我想獲得所有故障單的列表,但它說並非所有的代碼路徑都返回一個值。是否有人沒有我在做什麼錯誤謝謝錯誤捕獲最佳方法

public List<TroubleTicket> GetAllTroubleTickets() 
{ 
    try 
    { 

     List<TroubleTicket> tickets = new List<TroubleTicket>(); 


     var q = _supportDeskEntities.TroubleTickets.ToList(); 
     return q; 
    } 

    catch (Exception ex) 
    { 


    } 


} 
+0

異常提供有關軟件狀態的有用信息。我不會忽視他們。然而,當你必須返回類似的東西時,我會推薦一個空列表:它可以迭代而不必費心使用null,而空列表總是可以提供_information_。 – 2014-10-09 12:19:36

回答

1

您需要從catch語句返回一個值(或拋出另一個異常)。否則,該函數將返回null

你可以試試這個:

public List<TroubleTicket> GetAllTroubleTickets() 
{ 
    try 
    { 

     List<TroubleTicket> tickets = new List<TroubleTicket>(); 


     var q = _supportDeskEntities.TroubleTickets.ToList(); 
     return q; 
    } 

    catch (Exception ex) 
    { 
     return new List<TroubleTicket>(); // This is just in case you want to ignore any exceptions 

    } 


} 

catch (Exception ex) 
    { 
     throw new Exception("There was an error getting tickets"); // Probably not as good of a way as you lose the exception details 

    } 
+0

我不同意「否則,函數將返回null」。真的應該是「否則,代碼不會編譯」。 – juharr 2014-10-09 13:02:37

+0

@juharr我想我已經習慣了VB.net編譯器的默認值。不返回值只是返回'nothing',但創建編譯器警告,感謝更正 – 2014-10-09 13:43:44

2

如果你發現一個異常的函數返回值。因此,改變這種:

catch (Exception ex) 
{ 
} 

要這樣:

catch (Exception ex) 
{ 
    return null; 
} 

或者當一個例外是捕獲,那麼你可以做到這一點,如果你希望它返回一個空列表:

catch (Exception ex) 
{ 
    return new List<TroubleTicket>(0); 
} 

如果我們正在採取最佳做法,然後我會說你應該記錄異常,然後重新拋出它。像這樣:

catch (Exception ex) 
{ 
    //write to log 
    throw ex; 
} 
+0

在處理實體框架時,Null是否真的是最佳的行爲? – rogue39nin 2014-10-09 12:17:02

+0

@Sheldon:取決於你在調用它的函數中所期待的。我已經更新了答案。你可以返回一個像上面這樣的空列表 – Arion 2014-10-09 12:19:02

1

如果沒有拋出異常,則只返回一個值。您必須從catch塊內返回,或者返回try/catch結構之外。

所以,你可以返回在兩個不同的地方:

public List<TroubleTicket> GetAllTroubleTickets() 
{ 
    try 
    { 
     var q = _supportDeskEntities.TroubleTickets.ToList(); 
     return q; 
    } 
    catch (Exception ex) 
    { 
     // You can also return "new List<TroubleTicket>()" if null is an unacceptable return value 
     return null; 
    } 
} 

或保持一個返回值的變量,並將其設置在兩個不同的位置,並在一個位置返回它:

public List<TroubleTicket> GetAllTroubleTickets() 
{ 
    List<TroubleTicket> tickets; 
    try 
    { 
     tickets = _supportDeskEntities.TroubleTickets.ToList(); 
    } 
    catch (Exception ex) 
    { 
     // You can also use "new List<TroubleTicket>()" if null is an unacceptable return value 
     tickets = null; 
    } 
    return tickets; 
} 
1

如果發生異常,您不會返回任何內容,並且您不會將列表分配給List<TroubleTicket> tickets,而是分配給其他變量。你可以這樣做:

public List<TroubleTicket> GetAllTroubleTickets() 
{ 
    List<TroubleTicket> tickets = null; 
    bool gotTickets = true; 
    try{ 
     tickets = _supportDeskEntities.TroubleTickets.ToList(); 
    } 
    catch (SpecificException ex){ 
     gotTickets = false; 
    } 
    catch (Exception ex){ // catches all other "unexpected" exceptions 
     // log and/or... 
     throw; 
    } 
    return gotTickets ? tickets : null; 
} 

但是,你不應該捕捉所有類型的例外,但只有你期望的特定類型。您還應該記錄所有其他類型的異常。

+0

當你從不使用它時,將'tickets'初始化爲一個空列表有什麼意義? – juharr 2014-10-09 13:12:59

+0

@juharr:我從方法中返回它。但是你是對的,我認爲最好不要初始化它,如果它是從'_supportDeskEntities.TroubleTickets.ToList()'初始化的。 – 2014-10-09 13:14:49

+0

+1表示您應該只記錄特定的例外情況。 – juharr 2014-10-09 13:19:05

0

你的catch塊沒有返回任何東西。

public List<TroubleTicket> GetAllTroubleTickets() 
{ 
    List<TroubleTicket> tickets =null; 
    try 
    { 
     tickets = new List<TroubleTicket>(); 
     var q = _supportDeskEntities.TroubleTickets.ToList(); 
     return q; 
    } 

    catch (Exception ex) 
    { 
     //Log or handle your error 
    } 

    return tickets; 
} 
+0

這裏真的沒有指向'tickets'的變量。您可以將其刪除,並在方法結尾處返回「null」,並獲得相同的結果,同時避免初始化未使用的列表。 – juharr 2014-10-09 13:16:30