如何捕获JsonConverter属性中抛出的异常?

时间:2016-07-27 01:51:06

标签: c# json.net asp.net-web-api2

我正在构建一个自定义JsonConverter,用于模型类的属性。该模型用作Web API控制器中的输入参数。在我的JsonConverter中,如果我不喜欢输入,我会抛出FormatException

这是我模特的一部分:

public class PropertyVM
{
    public string PropertyId { get; set; }

    [JsonConverter( typeof(BoolConverter) )]
    public bool IsIncludedInSearch { get; set; }
}

这是我的控制器动作:

[HttpPost, Route("{propertyId}")]
public IHttpActionResult UpdateProperty( string propertyId, [FromBody] PropertyVM property )
{
    bool success;
    try
    {
        property.PropertyId = propertyId;   
        success = _inventoryDAL.UpdateProperty( property );
    }
    catch ( Exception ex ) when 
    ( 
           ex is ArgumentException 
        || ex is ArgumentNullException
        || ex is ArgumentOutOfRangeException
        || ex is FormatException 
        || ex is NullReferenceException
        || ex is OverflowException 
    )
    {
        return BadRequest( ex.Message );
    }

    if ( !success )
    {
        return NotFound();
    }

    return Ok();
}

如果我使用IsIncludedInSearch的错误值调用控制器,我希望在控制器中捕获FormatException,但这种情况并没有发生。我的转换器中会抛出异常,但是当媒体格式化程序运行时会发生这种情况。当我进入我的控制器时,异常被抛出,但我无法抓住它。所以即使我有一个糟糕的参数,我也会返回OK

如何让控制器看到转换器引发异常,以便我可以返回相应的响应?

1 个答案:

答案 0 :(得分:1)

您必须检查模型状态错误,其中包含验证错误和模型的其他属性错误。所以你可以在你的代码中做这样的事情:

    [HttpPost, Route("{propertyId}")]
    public IHttpActionResult UpdateProperty(string propertyId, 
        [FromBody] PropertyVM property)
    {
        bool success = false;
        if (ModelState.IsValid)
        {
            try
            {
                property.PropertyId = propertyId;
                success = _inventoryDAL.UpdateProperty(property);
            }
            catch (Exception ex) //business exception errors
            {
                return BadRequest(ex.Message);
            }

        }
        else
        {
            var errors = ModelState.Select(x => x.Value.Errors)
                                   .Where(y => y.Count > 0)
                                   .ToList();
            return ResponseMessage(
                Request.CreateResponse(HttpStatusCode.BadRequest, errors));
        }

        if (!success)
        {
            return NotFound();
        }

        return Ok();
    }