我需要一些关于我的网络服务中良好的异常处理策略的建议。
我的Web服务方法正在针对Oracle数据库执行标准CRUD操作。因此,我有一些方法可以选择数据并返回数据集,而其他方法可以执行插入/更新/删除操作,也不会返回任何内容。
最初,我在try-catch中的每个webservice方法中都拥有了所有代码,最终捕获了Oracle异常。我在网上看到一些文章说这不好,如果有可能出现异常,我应该只在try-catch中包围一些东西。现在我想,如果我只在try-catch-finally块中放入我的Insert / Update / Delete方法,那也许是最好的。
所以我的问题是:
我应该将所有方法都放在try-catch-finally中吗?它们都与Oracle交互并可能导致异常。或者我应该只针对插入/更新和删除方法执行此操作吗?
当发生异常时,我对他们想要发生的事情没有任何要求。我只是在谈论常识。我知道他们绝对不希望应用程序结束。我打算以某种方式记录异常并将其重新抛给客户端。当存在Oracle异常时,我正在执行此操作。
答案 0 :(得分:2)
基本上你需要对每个WebMethod
进行try-catch。由于事件不会起泡,我认为没有其他更好的方法。
但是,您可以使用此post中的技巧让您的生活更轻松。
他的方法是创建这样的实用程序方法,并通过将委托传递给Web方法逻辑来调用该方法。
private T Execute<T>(Func<T> body)
{
//wrap everything in common try/catch
try
{
return body();
}
catch (SoapException)
{
//rethrow any pre-generated SOAP faults
throw;
}
catch (ValidationException ex)
{
//validation error caused by client
ClientError innerError = new ClientError();
//TODO: populate client error as needed
//throw SOAP fault
throw this.GenerateSoapException(
"An error occurred while validating the client request.",
SoapException.ClientFaultCode,
innerError);
}
catch (Exception ex)
{
//everything else is treated as an error caused by server
ServerError innerError = new ServerError();
//TODO: populate server error as needed
//TODO: log error
//throw SOAP fault
throw this.GenerateSoapException(
"An unexpected error occurred on the server.",
SoapException.ServerFaultCode,
innerError);
}
}
答案 1 :(得分:1)
我假设您使用的是ASP.NET WebMethods。我的建议是你总是在服务层上捕获异常,写一个日志并抛出一个SoapException。基本上你可以尝试捕获每个服务方法(WebMethod)。如果您没有这样做,您将向调用该服务的客户端公开异常详细信息,这可能是一个潜在的安全问题。