在错误上返回可空类型是不好的做法吗?

时间:2016-08-12 01:27:29

标签: c#

我正在编写一个程序,用于从连接到我车的蓝牙OBDII加密狗读取数据。我有一个OBDII助手类,负责获取特定的车辆数据。我写的所有方法都返回一个可以为空的类型;我的想法是,当我使用这个类时,我可以通过检查null来处理错误。这是两个样本:

private byte?[] getPIDData(string pid)
    {
        string data = sendMessage(pid);
        string[] bytes = data.Split(' ');
        try
        {
            byte?[] convertedData = new byte?[bytes.Length - 2];
            for(int i = 2; i < bytes.Length; i++)
            {
                convertedData[i - 2] = Convert.ToByte(bytes[i], 16);
            }
            return convertedData;
        }
        catch(FormatException)
        {
            return null;
        }
    }

public double? GetEngineLoad()
    {
        byte?[] data = getPIDData("0104");
        if (data == null)
            return null;
        return (100.0 / 255.0) * (double)(data[0]);
    }

这是不好的做法/在使用这些方法时是否有更好的方法来指出错误?

3 个答案:

答案 0 :(得分:0)

尽管返回可空类型通常不是一种坏习惯,但它绝对不是报告错误的合适技术。使用API​​的图层可以捕获异常,并使用默认值,记录错误等。

如果您的代码路径引发错误,那么使用您的API的代码应该处理它。通过返回null使代码难以维护来掩盖错误,因为异常情况不会引起注意。

另一种方法是在API中使用输出参数来报告状态而不是抛出异常:

private bool TryGetPIDData(string pid, out byte[] res) {
    if (... success) {
        res = newValue;
        return true;
    } else {
        res = null;
        return false;
    }
}

答案 1 :(得分:0)

他们是最后的手段。字节数组本质上是可空的,因此您只需返回byte []即可。另外,byte?[]没有做你想象的那样。 byte?[]是一个可空字节数组,而不是可空字节数组。

对于双倍,它可能是允许的。许多try-parse样式方法对最终数据使用out参数,函数的实际返回值是成功的布尔值。

但是,如果通常不会出现错误,我会抛出异常或捕获它并为您的API抛出一个特定的异常。

此外(100/255)始终为0.

答案 2 :(得分:0)

如果你是唯一一个编写和使用所有代码的人,并且你确切地知道你正在做什么那么它没关系,因为没有人必须适应你的编程风格.....但我永远不会这样做,尤其是在与其他程序员合作时。

忘记检查null是太容易了。 Null不应该表明存在问题,这就是抛出异常的原因。 Nulls不会强制停止执行不在catch块中的代码,并且实际上并不表示出现了错误,他们只是显示数据不存在。如果您必须找出问题所在的位置,请不要打包堆栈跟踪以显示问题所在的位置。

C#是为异常而设计的,表示存在问题。你能用另一种方式处理吗?当然,但是你正在为相同或更少的利益做更多的工作。我唯一一次考虑不使用异常的情况就是我必须绝对确保没有任何例外未被捕获的情况。老实说,即使这样,我也会考虑采用与使用空值表示错误不同的方法。它太容易出错,而且容易出错。