[英]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項目中的StringEnumConverter
和JsonSerializerInternalBase
類。
您是否知道在哪里掛鈎有問題的庫以覆蓋錯誤消息? 或者關於如何解決問題的任何其他想法(停止在錯誤消息中顯示完整的命名空間)?
我的問題是,我可以以某種方式重新拋出一個異常,指定一個不同的消息,就像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...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.