如何捕获响应模型序列化期间抛出的异常

时间:2018-01-26 02:54:07

标签: c# exception asp.net-web-api serialization datacontract

我在模型类中有错误的业务逻辑,产生异常,但没有被异常处理捕获。是否可以通过控制器代码异常处理捕获模型序列化操作期间发生的异常?

代码示例:

BrittleModel.cs

[DataContract]
public class BrittleModel
{
    private string peanutBrittle = null;

    [DataMember]
    public string PeanutBrittle
    {
        get
        {
            // if not set generates exception during serialization
            return peanutBrittle.ToString();
        }
        set
        {
            peanutBrittle = value;
        }
    }
}

API /脆

    public HttpResponseMessage Get()
    {
        try
        {
            return Request
                .CreateResponse(HttpStatusCode.OK, new Models.BrittleModel());
        }
        catch
        {
            return Request
                .CreateResponse(HttpStatusCode.InternalServerError, "Something went awry.");
        }
    }

实际响应 - 异常消息不是“出错了。”

<Error>
  <Message>An error has occurred.</Message>
  <ExceptionMessage>
    The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.
  </ExceptionMessage>
  <ExceptionType>System.InvalidOperationException</ExceptionType>
  <StackTrace/>
  <InnerException>
    <Message>An error has occurred.</Message>
    <ExceptionMessage>
      Object reference not set to an instance of an object.
    </ExceptionMessage>
    <ExceptionType>System.NullReferenceException</ExceptionType>
    <StackTrace>
      at test.Models.BrittleModel.get_PeanutBrittle() in Models\BrittleModel.cs:line 19 at
      WriteBrittleModelToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract )
      at System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj,
      XmlObjectSerializerWriteContext context) at
      System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract
      dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at
      System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract
      dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at
      System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator
      writer, Object graph, DataContractResolver dataContractResolver) at
      System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator
      writer, Object graph, DataContractResolver dataContractResolver) at
      System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator
      writer, Object graph, DataContractResolver dataContractResolver) at
      System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph)
      at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(Type type, Object value, Stream
      writeStream, HttpContent content) at
      System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(Type type, Object value,
      Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken
      cancellationToken)
      --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.MoveNext()
    </StackTrace>
  </InnerException>
</Error>

0 个答案:

没有答案