首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何捕获JsonConverter属性中抛出的异常?

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

Stack Overflow用户
提问于 2016-07-27 01:51:05
回答 1查看 1.2K关注 0票数 2

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

这是我的模型的一部分:

代码语言:javascript
复制
public class PropertyVM
{
    public string PropertyId { get; set; }

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

这是我的控制员的动作:

代码语言:javascript
复制
[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,即使我得到了一个糟糕的配角。

如何让控制器看到转换器抛出异常,以便返回适当的响应?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-27 06:34:08

您必须检查模型状态错误,这将包含模型的验证错误和其他属性错误。因此,您可以在代码中执行这样的操作:

代码语言:javascript
复制
    [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();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38602438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档