2015-10-19 226 views
0

我有一个UtilityMethod根据查找返回一个字符串。抛出一个描述性错误

public static string UtilityMethod(int id) 
{ 
    var result = MyListOfThings.FirstOrDefault(x=>x.ThingId == id); 

    if (result == null) 
    { 
     // throw error here 
    } 
    return result.ThingName; 
} 

我的问题是,在这里抛出错误是正确的吗?我该如何抛出错误。错误应该是描述性的,所以它指出了为了解决问题应该做些什么。

+1

我们完全不知道,因为这一切都取决于您的方法的语义。返回'null'是否正确?谁知道!另外,请注意,如果找不到具有该ID的事物,则您的代码已经可以抛出NRE。 – Jon

+0

可能它的伪代码无论如何 – wingyip

回答

0

我想你的意思是抛出异常?

通常情况下,如果程序的结果是可以预测或经常发生的,则不应该抛出异常。

而是使用一个错误代码(0表示成功,1,2,3为不同类型的错误)

+0

我想这是devs不是用户的错误消息。用户会收到一个通用的错误信息。 Devs会通过电子邮件发送错误。错误会因配置错误而发生 – wingyip

0

如果你正在编写一个库方法,可以抛出异常,或者更具体地说,写一个库,整个代码库抛出同样的异常(如ExceptionLibraryException)针对不同的情况,你可能想在你的异常错误编号:

public class LibraryException : Exception 
{ 
    public int ErrorCode { get; private set; } 
    public LibraryException(int errorCode, string message) 
     : base(message) 
    { 
     ErrorCode = errorCode; 
    } 
} 

这样你的GUI代码可以捕获该异常,并翻译错误编号到用户友好(本地化)的错误信息 - 无需执行本地化和图书馆的用户友好性。

0

问题是,是不是找到存储库中的匹配项目真的例外?意思是说,应该是预计该项目是否被找到,或者它是否代表错误在程序中或违反假设?如果不是特例,那么返回null意味着“没有符合您的标准的对象”,然后调用者可以决定从那里做些什么。

抛出一个异常可以让你包含一条消息,但是除了找不到一个项目以外没有其他信息,所以它不会提供任何调用者不知道的信息,并且会增加开销创建并抛出调用者必须处理的异常。

的错误应该是描述性的,因此表明正是应该按顺序完成修复

有什么解决?您寻找具有给定id的物品,如果找不到物品,则返回null。除了更友好的错误之外,我没有看到抛出异常的好处,但您可以记录行为,以便调用方明白返回值的含义。

0

你想要处理什么情况?你的清单可以清空吗?别名可以为空吗?

如果列表不为空,并且Thing对象的匹配id为null ThingAlias,则会抛出您的错误。

如果您的清单为空,FirstOrDefault将返回null,您将在方法的第一行中得到NullReferenceException

根据您的应用程序,你可以做以下一些:

  • 返回NULL如果该列表是空的,以及如何在调用方法无效,
  • 返回一个特殊的消息,如果列表为空,例如[要显示没有进一步的处理,如果它是怎么回事]“<列表>没有项目”,
  • 抛出一个异常,如果列表为空[好主意,如果列表中不应该是空],
  • 使用DefaultIfEmpty代替如果列表为空,则FirstOrDefault指定默认的Thing对象,例如MyListOfThings.DefaultIfEmpty(new Thing(default_params).First(t => t.ThingId == id),
  • 使用字典而不是列表来确保您最多只有一个具有给定ID的项目,那么您可以使用TryGetValue来处理未找到项目的情况。