我目前有一些代码,如果用户向我发送验证失败的数据(见下文),则会异常抛出异常。我喜欢它,因为我确保应用程序中的任何错误都被捕获和处理。然而,我担心代码变慢,因为抛出异常会占用大量内存。我也担心它可能是“糟糕的代码”。你的建议是什么?感谢
public class BTAmendAppointmentRequest
{
public DataLayer.WebserviceMessage AddBTAmendAppointmentRequest(DataLayer.BTAmendAppointmentRequest req)
{
DataLayer.WebserviceMessage rsp = new DataLayer.WebserviceMessage();
try
{
if (!String.IsNullOrEmpty(req.AppointmentReference))
req.AppointmentReference = req.AppointmentReference.Trim();
if (req.OrderRequestID < 1 || string.IsNullOrEmpty(req.AppointmentReference))
{
throw new Exception("Amend appointment failed, you must supply a valid appointment reference and order reference");
}
...Do other stuff
}
catch (Exception ex)
{
rsp = new Service.WebserviceErrorMessage(ex);
}
return rsp;
}
}
答案 0 :(得分:2)
如果您期待这些错误,您应该向用户返回错误消息,而不是抛出异常。
保留例外情况的例外情况。
除了昂贵,异常的含义之外,语义是发生异常的事情。验证失败是不例外,它是预期。
话虽如此,看到您正在使用Web服务,假设您还在服务调用之前验证,则异常是合理的事情。这是合理的,因为任何都可以调用Web服务 - 验证可能没有发生,并且这样的错误应该是例外的。此外,至少在.NET Web服务中,Web异常可能是将这些事情传达回客户端的最佳方式。
答案 1 :(得分:1)
异常应被视为最后的错误陷阱。他们应该是“特殊的”。数据输入错误不是例外 - 它们是非常常见的预期事件。您需要处理验证控件或进程的验证问题,处理它们 - 显示错误消息并且不要让处理继续。
您的另一个问题是,如果您遇到的第一个错误引发异常,则无法轻松执行完整表单验证。如果我填写的表单中每个错误都单独突出显示,我会很快放弃。您需要能够在页面上验证和显示所有错误,并且在未经验证成功的情况下不允许进度。
答案 2 :(得分:1)
我倾向于同意Oded的观点,即异常应仅用于你不期望的东西。另一种看待它的方法是使用错误集合,您可以验证更大的批处理,而不是在第一个问题上抛出异常。这对于消费您服务的人来说更有用。
对于Web服务,我会将整个响应打包在一个自定义响应对象中,该对象具有返回码。这允许您返回错误代码,然后将错误集合封装在响应对象中。