我正在组建一个技术分析库,我希望其他人最终可以使用它,所以我想确保我验证数据进入我的方法并返回适当的东西。现在,如果验证失败,我会返回一个空值。抛出异常会更合适吗?如果其他开发人员可以使用此库,那么更好的做法是什么?以下是我目前的验证方式:
/// <summary>
/// Calculates the MACD (Moving Average Convergence Divergence) over n periods, where n is the number of elements in the input prices.
/// </summary>
/// <param name="InputValues">The numbers used for the MACD calculation. Index 0 must be the oldest, with each index afterwards one unit of time forward. There must more values present than what the SlowEMA calls for.</param>
/// <param name="FastEMA">Optional: The smaller (faster) EMA line used in MACD. Default value is 12. Must be less than the SlowEMA.</param>
/// <param name="SlowEMA">Optional: The larger (slower) EMA line used in MACD. Default value is 26. Must be less than the number of elements in InputValues.</param>
/// <param name="SignalEMA">Optional: The EMA of the MACD line. Must be less than the FastEMA.</param>
/// <returns>Returns the components of a MACD, which are the MACD line itself, the signal line, and a histogram number.</returns>
public MACD CalculateMACD(decimal[] InputValues, decimal FastEMA = 12M, decimal SlowEMA = 26M, decimal SignalEMA = 9M)
{
MACD result;
// validate that we have enough data to work with
if (FastEMA >= SlowEMA) { return result; }
if (SlowEMA >= InputValues.Count()) { return result; }
if (SignalEMA >= FastEMA) { return result; }
// Do MACD calculation here
return result;
}
答案 0 :(得分:6)
.Net中有三种标准的参数异常:
它们在构造函数上都有重载,允许您说明哪个参数是一个问题,并且在抛出它们时会发出更详细的消息。
使用这些是正常的做法。
编辑:
除了null(或空或其他)可接受之外,我仍然倾向于抛出异常,因为您不一定知道您的库的用户可以使用什么。如果他们不介意空值,他们总是可以捕获异常并在适当的时候处理它。
但是,如果您没有抛出异常,那么您在向图书馆的消费者告知问题的能力方面是有限的。
答案 1 :(得分:1)
由于您尝试返回未分配的变量,因此无法编译此代码。假设你真的使用MACD result = new MACD();
,答案是:它取决于。你能用初始化的对象做任何吗?然后是的,可以归还。
如果没有,您可return null
检查一下,或只是throw
ArgumentException()
。
答案 2 :(得分:0)
如果您的应用程序遇到任何错误或不正确的状态,如果继续未处理或没有额外注意会导致损坏,我会考虑抛出异常的事实。
如果您的数据太少而无法进行有意义的分析,则由您决定结果计算是否正确/不正确/有害/等。
您还必须记住,抛出异常意味着中断程序的正常执行路径并输入其他路径(异常处理路径)。
我会通过某种消息通知用户这种情况,让程序以普通的方式终止或继续,而不是强行抛出异常。
答案 3 :(得分:0)
如果以错误的方式使用CalculateMACD
因为传递了荒谬的参数,则可以将其视为编程错误,并且应该抛出异常。不要担心在这种情况下抛出异常的后果,因为它只应该在开发环境中测试应用程序时抛出。
但是,如果有问题的参数可以在生产环境中传递,则应确定这是否是正常情况。在这种情况下,请考虑在返回值中返回适当的信息(例如,特殊属性或返回null
。
如果是不应发生的异常情况,抛出异常可能是更好的方法。在这种情况下,请确保应用程序在之后仍然可以顺利运行,或者至少以适当且可理解的消息结束。
答案 4 :(得分:0)
验证您的参数是一种常见的良好做法。有些库可以进行常见的参数检查,因此您不必重复这些检查。这是一个名为Argument Validator的作品,我为我的项目编写并使用它。
示例用法如下所示:
public void AddPerson(string personId, Person personData)
{
Throw.IfNullOrEmpty(personId, nameof(personId));
Throw.IfNull(personData, nameof(personData));
...
public void Compute(int generation)
{
Throw.IfNot(() => generation > 100);
...
public void Compute(int generation)
{
Throw.IfOutOfRange(generation, 1, 100, nameof(generation));