抛出描述性错误

本文关键字:错误 描述性 | 更新日期: 2023-09-27 18:18:19

我有一个基于查找返回字符串的UtilityMethod。

public static string UtilityMethod(int id)
{
    var result = MyListOfThings.FirstOrDefault(x=>x.ThingId == id);
    if (result == null)
    {
        // throw error here
    }
    return result.ThingName;
}

我的问题是,在这里抛出一个错误是正确的吗?我该如何抛出错误。错误应该是描述性的,这样它就可以准确地指出应该做什么来修复。

抛出描述性错误

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

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

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

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

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

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

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

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

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

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

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

问题是,不是在存储库中找到匹配的项真的异常吗?也就是说,是否应该期望找到一个项,或者它是否表示程序中的错误或违反了假设?如果不是异常情况,那么返回null将意味着"没有一个对象符合您的标准",然后调用者可以决定从那里做什么。

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

错误应该是描述性的,这样它就可以准确地指出应该做什么来修复

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