我有一个控制电路,我通过串口进行通信。如果响应命令与某种格式不匹配,我认为它是一个错误,并想知道我是否应该返回错误代码或抛出异常?例如:
public double GetSensorValue(int sensorNumber)
{
...
string circuitCommand = "GSV,01," + sensorNumber.ToString(); // Get measurement command for specified sensor.
string responseCommand;
string expectedResponseCommand = "GSV,01,1,OK";
string errorResponseCommand = "ER,GSV,01,1,62";
responseCommand = SendReceive(circuitCommand); // Send command to circuit and get response.
if(responseCommand != expectedResponseCommand) // Some type of error...
{
if(responseCommand == errorResponseCommand) // The circuit reported an error...
{
... // How should I handle this? Return an error code (e.g. -99999) or thrown an exception?
}
else // Some unknown error occurred...
{
... // Same question as above "if".
}
}
else // Everything is OK, proceed as normal.
...
}
谢谢!
答案 0 :(得分:8)
在几乎所有案例中,我都会通过异常传达错误。我几乎从不使用“错误代码” - 有时候在int.TryParse
等中给出成功/失败以及结果是有用的,但我不认为这种情况是这样的。这听起来像一个真正的错误条件,应该停止进一步的进展,所以一个例外是合适的。
编辑:正如评论中所述,如果报告错误的电路确实是“预期的”并且调用者应该能够处理它并且应该主动寻找那种情况,那么使用状态代码是合理的。 / p>
不幸的是,错误处理是我们在软件工程中还没有真正做到的事情之一......
答案 1 :(得分:3)
严格地说,当你处于'特殊'环境时,即你不会期望的情况下会使用例外。
如果是我,我可能会在第一种情况下返回错误代码(已知错误响应),并在第二种情况下抛出异常(未知错误代码)
答案 2 :(得分:2)
在你的情况下,抛出异常会更好。因为该方法的调用者可以区分“合法”输出和错误条件。如果您返回错误代码,它仍然是一个数值,因此调用者可能将其误解为控制电路的输出。
答案 3 :(得分:2)
就个人而言,我喜欢通过定义某种响应对象来处理这种情况。我通过这样的经验来衡量这一点并权衡应该被视为特殊的东西。如果您正在与某些设备连接并且用户关闭设备或其他设备,这是一个例外情况,您将抛出异常。
如果对设备的特定方法调用失败或某事,那不是特别的,但这是一个错误。如果我返回一个double,我不想定义一个幻数,我不想抛出异常。所以,我定义了类似的东西:
class DeviceResult //could also be struct
{
public double ReturnValue { get; set; }
public bool IsValid { get; set; }
public string ErrorMessage { get; set; }
}
这里的细节并不重要 - 您将根据您的方法所需的客户进行调整。在此示例中,客户端API将检查是否有效,如果是,则使用返回值 - 没有幻数,也没有异常。范式更重要。我看到它的方式,你使用的是面向对象的语言 - 所以你不妨使用对象。 :)
答案 4 :(得分:0)
错误代码。
抛出异常是一种好习惯:
答案 5 :(得分:0)
由于一些简单的事实,我建议在大多数情况下使用例外:
但有几点需要考虑:
但作为一般规则,我会说:坚持Exceptions,它简单,信息丰富,可调试且易于处理,即使它可能会带来轻微的性能成本