抛出描述性错误

时间:2015-10-19 19:31:03

标签: c#

我有一个UtilityMethod,它根据查找返回一个字符串。

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

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

我的问题是,在这里抛出错误是否正确?我该如何抛出错误。该错误应该是描述性的,因此它准确地表明了应该做什么以便修复。

4 个答案:

答案 0 :(得分:0)

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

通常情况下,如果您的计划结果是可以预测或经常发生的事情,您不应该抛出异常。

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

答案 1 :(得分:0)

如果您正在编写可以抛出异常的库方法,或者更具体地说,编写一个遍及其代码库的库会针对不同的情况抛出相同的异常(例如ExceptionLibraryException),您可能希望在例外中包含错误编号:

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

通过这种方式,您的GUI代码可以捕获此异常,并将错误号转换为用户友好(本地化)的错误消息 - 无需在库中进行本地化或用户友好性。

答案 2 :(得分:0)

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

抛出异常将允许您包含一条消息,但除了找不到某个项目之外没有其他信息,因此它不会提供调用者不知道的任何信息,并会增加开销创建并抛出调用者必须处理的异常。

  

错误应该是描述性的,因此它确切地表明了为了解决

应该做些什么

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

答案 3 :(得分:0)

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

如果列表不为空并且匹配id为Thing的对象为空ThingAlias,则会引发错误。

如果您的列表为空,FirstOrDefault将返回null,您将在方法的第一行获得NullReferenceException

根据您的应用程序,您可以执行以下某些操作:

  • 如果列表为空并且在调用方法中处理null,则返回null,
  • 如果列表为空,则
  • 返回特殊消息,例如"<列表中没有项目>" [如果它将在没有进一步处理的情况下显示],
  • 如果列表为空则抛出异常[好主意,如果列表永远不会为空],
  • 如果列表为空,则使用DefaultIfEmpty而不是FirstOrDefault指定默认的Thing对象,例如MyListOfThings.DefaultIfEmpty(new Thing(default_params).First(t => t.ThingId == id)
  • 使用字典而不是列表来确保您最多只有一个具有给定ID的项目,然后您可以使用TryGetValue来处理找不到该项目的情况。