4

我正在整理一个技术分析库,我希望其他人最终可以使用它,所以我想确保我验证进入我的方法的数据并返回适当的东西。现在,如果验证失败,我让它返回一个空白值。抛出异常会更合适吗?如果其他开发人员可以使用这个库,更好的做法是什么?这是我目前验证的方式:

    /// <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;
    }
4

5 回答 5

6

.Net 中有三个标准的参数异常:

  • 参数异常
  • 参数NullException
  • 参数OutOfRangeException

它们的构造函数都有重载,以允许您说明哪个参数是一个问题,并在抛出它们时给出更详细的消息。

使用这些将是正常的做法。

编辑:

除了可以接受 null (或空或其他)之外,我仍然倾向于抛出异常,因为您不一定知道您的图书馆的用户会接受什么。如果他们不介意空值,他们总是可以捕获异常并酌情处理它。

但是,如果您不抛出异常,那么您告诉图书馆使用者问题所在的能力就会受到限制。

于 2012-06-29T13:53:09.153 回答
1

由于您尝试返回未分配的变量,因此此代码将无法编译。假设您真的使用MACD result = new MACD();,答案是:视情况而定。你可以用一个初始化的对象做任何事情吗?那么是的,可以退货。

如果没有,您可以return null检查一下,或者只是throw一个ArgumentException().

于 2012-06-29T13:54:33.097 回答
0

如果CalculateMACD由于传递了荒谬的参数而以错误的方式使用了,这可以被认为是编程错误并且应该抛出异常。不要担心在这种情况下抛出异常的后果,因为它应该只在开发环境中测试应用程序时抛出。

但是,如果有问题的参数可以在生产环境中传递,您应该确定这是否是正常情况。在这种情况下,请考虑在返回值中返回适当的信息(特殊属性或通过返回null例如。

如果这是不应该发生的异常情况,那么抛出异常可能是更好的方法。在这种情况下,请确保应用程序在之后仍能顺利运行,或者至少以适当且可理解的消息结束。

于 2012-06-29T14:18:12.400 回答
0

我会考虑这样一个事实,如果您的应用程序运行到任何错误或不正确的状态,如果继续未处理或没有额外注意会造成损坏,那么应该抛出异常。

如果您的数据太少而无法进行有意义的分析,则由您决定结果计算是否正确/不正确/有害/等。

您还必须记住,抛出异常意味着中断程序的正常执行路径并输入附加路径(异常处理路径)。

我会用某种消息通知用户这种情况,并让程序以普通方式终止或继续,而不是强行抛出异常。

于 2012-06-29T13:58:53.447 回答
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));
于 2016-08-21T00:18:50.527 回答