6

我使用属性设置器来验证 C# 类中的输入并在无效输入上抛出异常。我还使用 Json.NET 将 json 反序列化为对象。问题是我不知道在哪里捕获 setter 抛出的无效 json 值的异常。异常不会从JsonConvert.DeserializeObject方法中抛出。

public class A{
    private string a;

    public string number{
        get {return a;}
        set {
            if (!Regex.IsMatch(value, "^\\d+$"))
                throw new Exception();
            a = value;
        }
    }
}

public class Main
{
    public static void main()
    {
         // The Exception cannot be caught here.
         A a = JsonConvert.DeserializeObject<A>("{number:'some thing'}");
    }    
}
4

1 回答 1

10

您需要在反序列化对象时订阅错误:

            JsonConvert.DeserializeObject<A>("{number:'some thing'}",
            new JsonSerializerSettings
            {
                Error = (sender, args) =>
                {
                    Console.WriteLine(args.ErrorContext.Error.Message);
                    args.ErrorContext.Handled = true;
                }
            });

如果您删除args.ErrorContext.Handled = true语句,则 setter 中引发的异常将从JsonConvert.DeserializeObject方法中重新抛出。它将被包裹在JsonSerializationException("Error setting value to 'number'") 中。

于 2012-12-06T10:03:28.557 回答