簡體   English   中英

最新版本中的異常消息更改

[英]Exception message change in latest version

我剛剛將Newtonsoft.Json庫從4.5.1更新到5.0.8。 我注意到的是其中一條異常消息發生了變化。 一旦該值無法反序列化,我的400響應“錯誤轉換值...”中包含以下內容。 現在,這條消息在4.5.1中有所不同。 lib的版本。 問題是對象的全名是暴露的,這對我來說是一種不良行為。

為了澄清:

問題如下。 直到Newtonsoft.Json庫的4.5.1版本,拋出JsonSerializationException后,響應中的消息才指定某個對象無法序列化。 從該版本開始,響應消息中的庫,是的,它包括錯誤消息,但也包括它無法序列化的對象的全名。 遺憾的是,我不想將錯誤消息中的命名空間暴露給外界。

我只是檢查JSON lib的源代碼,我發現StringEnumConverter中的代碼現在是:

catch (Exception ex)
{
    throw JsonSerializationException.Create(reader, "Error converting value {0} to type '{1}'.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.FormatValueForPrint(reader.Value), objectType), ex);
}

同時它拋出了默認的Enum.Parse ArgumentException ,並顯示消息“必須指定用於在字符串中解析的有效信息”。 之前。

現在,我更喜歡這條消息,因為它沒有向用戶顯示我的API的內部命名空間。

我試圖在我的Application_Start方法中掛起事件JsonFormatter.SerializerSettings.Error,但是我無法做我想做的事情。 我有機會訪問我想要處理的異常,

private static void Error(object sender, ErrorEventArgs errorEventArgs)
{
    if (errorEventArgs.ErrorContext.Error.GetType() == typeof(JsonSerializationException))
    {

但是所有屬性都是只讀的,我認為要修改的對象標記為內部。 重新拋出異常也不是一個例子。

為清楚起見,請查看Newtonsoft.Json.Net40項目中的StringEnumConverterJsonSerializerInternalBase類。

您是否知道在哪里掛鈎有問題的庫以覆蓋錯誤消息? 或者關於如何解決問題的任何其他想法(停止在錯誤消息中顯示完整的命名空間)?

我的問題是,我可以以某種方式重新拋出一個異常,指定一個不同的消息,就像4.5.1中的那個消息一樣嗎?

過了一會兒,我發現了一個有效的解決方案。 我基本上創建了一個從StringEnumConverter派生的新轉換器並覆蓋了ReadJson方法。

我的新轉換器看起來像這樣:

public class StringEnumConverterEx : StringEnumConverter
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            // the message in the response, once an serialization exception is thrown, after the version 4.5.1 of Newtonsoft.JSON library,
            // has changed. As we do not want to expose the full namespace of our Enums, we are catching the exception and re-throwing it
            // with a different message.
            try
            {
                return base.ReadJson(reader, objectType, existingValue, serializer);
            }
            catch (JsonSerializationException)
            {
                string values = objectType.IsEnum ? String.Join(",", Enum.GetNames(objectType)) : string.Empty;

                throw new JsonSerializationException(string.Format("Error converting value {0}, possible values are: {1}",
                    objectType.Name, values));
            }
        }
    }

現在我只是在我的應用程序啟動時添加此轉換器而不是原始的一個StringEnumConverter。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverterEx());

這樣做可以覆蓋異常消息。 正如您所看到的,我還在消息中提供了該枚舉的可能值。

希望這會幫助別人。

干杯

必須指定有效信息以便在字符串中進行解析

就異常消息而言,這是一個非常悲慘的消息。 它完全沒有人類解決問題所需的任何信息。 這就是所需要的,必須改變軟件才能真正解決問題。 要么需要修復bug,要么需要改進數據驗證。 新的異常消息是一個很大的改進,它告訴你從哪里開始尋找。

您仍然可以隱藏自己,只有在它不為null時才顯示InnerException。 就像是:

  private static void Error(object sender, ErrorEventArgs errorEventArgs)
  {
      var ex = errorEventArgs.ErrorContext.Error;
      if (ex.GetType() == typeof(JsonSerializationException)) {
         if (ex.InnerException != null) ex = ex.InnerException();
         Console.WriteLine(ex.Message);
      // etc...

:編輯:沒有注意到你問過web.api

控制返回的錯誤消息的一種方法是拋出HttpResponseException而不是保持未處理的異常。 有關詳細信息,請參閱此博客

另一種方法是實現自定義操作過濾並將異常重定向到默認錯誤頁面或執行任何操作。 可在此處找到詳細示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM