2014-10-09 64 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