正确地抛出例外

时间:2018-01-11 19:40:10

标签: c# exception

我有以下代码

    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的单元测试。

如何正确抛出异常?

2 个答案:

答案 0 :(得分:0)

到目前为止,最简单的方法就是这样做。

catch (Exception exception)
{
    throw;
}

与您的代码不同,此代码还处理意外的异常,而不仅仅是SqlExceptionArgumentException

但你为什么要这样做?如果您希望异常传播给调用者,则只需删除此方法中的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;时一样)。

如果您想捕获其他类型的异常,只需将其添加到列表中即可。

但是,您的测试如何被打破尚不十分清楚。如果您需要更多帮助,您应该在此级别提供更多详细信息。