抛出描述性错误
本文关键字:错误 描述性 | 更新日期: 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表示不同类型的错误)
如果你正在编写一个可以抛出异常的库方法,或者更具体地说,编写一个在其整个代码库中针对不同情况抛出相同异常(例如Exception
或LibraryException
)的库,你可能需要在异常中包含一个错误编号:
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
返回值的含义是什么。