我有以下代码
public HttpResponseMessage AddDataToDatabase([FromBody] Data data)
{
try
{
var token = _tokenService.GetToken(Request.Headers.Authorization);
if (_pService.Permission(_tokenService.GetUserId(token), "Enable_Data"))
{
_noteService.AddData(data, _tokenService.GetUserId(token));
return Request.CreateResponse(HttpStatusCode.OK, "Data has been added to the case.");
}
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Cannot add data because you don't have permission."));
}
catch (Exception exception)
{
if (exception is SqlException)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, exception));
}
if (exception is ArgumentException)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.Conflict, exception.Message));
}
throw;
}
}
我想像catch块中的其他异常一样捕获Forbidden Exception,但不知道如何做到这一点。我现在返回Forbidden异常的方式会破坏返回SqlException和ArgumentExpception的单元测试。
如何正确抛出异常?
答案 0 :(得分:0)
到目前为止,最简单的方法就是这样做。
catch (Exception exception)
{
throw;
}
与您的代码不同,此代码还处理意外的异常,而不仅仅是SqlException
和ArgumentException
。
但你为什么要这样做?如果您希望异常传播给调用者,则只需删除此方法中的try...catch
块。然后在代码中抛出所需的异常。
如果您正在捕获并转换第三方例外,建议的方法如下。
catch (SqlException exception)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, exception));
}
catch (ArgumentException exception)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.Conflict, exception.Message));
}
答案 1 :(得分:0)
您应该使用更具选择性的捕获来替换捕获中的if
逻辑:
catch (SqlException exception)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, exception));
}
catch (ArgumentException exception)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.Conflict, exception.Message));
}
未捕获的异常将简单地通过(就像您使用throw;
时一样)。
如果您想捕获其他类型的异常,只需将其添加到列表中即可。
但是,您的测试如何被打破尚不十分清楚。如果您需要更多帮助,您应该在此级别提供更多详细信息。