2012-11-07 120 views
0

我使用FileHelper解析CSV文件。分析文件時遇到的錯誤消息顯示給最終用戶。最終用戶可能無法理解技術錯誤信息。沒有太多的職員知道什麼是Int32Class: UploadFooDtoFileHelper庫 - 自定義錯誤消息

我想定製錯誤消息,以便它們更加用戶友好。喜歡的東西:

  • 行1列2的字符串(一)中輸入的不是數字
  • 行2列3 '13 -14-15' 不是一個有效的日期

我在API中找不到任何可以定製錯誤消息的東西。到目前爲止,我得到的最多的是一些擴展方法來清除錯誤:

public static class FileHelperExceptionExtensions 
{ 
    public static string BuildMessage(this ErrorInfo error) 
    { 
     if (error.ExceptionInfo is ConvertException) 
     { 
      return ((ConvertException)error.ExceptionInfo).BuildMessage(); 
     } 

     if (error.ExceptionInfo is BadUsageException) 
     { 
      var message = error.ExceptionInfo.Message; 
      var readTo = message.IndexOf("Class:"); 
      return message.Substring(0, readTo); 
     } 

     return string.Format("Line: {0}. An unspecific error occured.", error.LineNumber); 
    } 

    public static string BuildMessage(this ConvertException exception) 
    { 
     return string.Format("Line: {0}. Column: {1}. Field: {2}. Cannot convert '{3}' to type: '{4}'", exception.LineNumber, exception.ColumnNumber, exception.FieldName, exception.FieldStringValue, exception.FieldType.Name); 
    } 
} 

但是這些擴展仍然有很多不足之處。是否可以自定義錯誤消息?

+0

我唯一的變化是將ConvertException轉換爲一個局部變量,使用「var convertInfo = error.ExceptionInfo as ConvertException;」然後檢查null,這樣你就不會做兩次類型檢查。 – netniV

回答

0

很難改進你的擴展方法,而不會比它的價值更麻煩。

您不能繼承默認轉換器(例如,FileHelpers.ConvertHelpers.Int32Converter,因爲它們是internalsealed)。您可以爲每種類型創建自己的custom converter(並將其基於來自FileHelpers的相應源代碼,例如,Int32Converter)。然後你可以提出ConvertException(也可以是sealed,所以你不能繼承)的替代方法,它會以不同的方式格式化消息。

+0

哦,我不能忍受密封和內部:)我不知道作者是否會接受拉請求,讓他們公開?合併和部署到nuget需要多長時間?現在我認爲下一步是使用正則表達式並解析錯誤消息。脆弱,是的。但這是爲了一個非常具體的操作,所以創建特定於上下文的字符串操作不是不成問題。 –

+0

我相信作者@MarcosMeli讓他們對所謂的性能好處保密。關於拉請求,FileHelpers庫不會非常頻繁地更改,但拉請求有時會被接受。看到[change log here](http://teamcity.codebetter.com/viewType.html?buildTypeId=bt66&tab=buildTypeChangeLog) – shamp00

+0

是的,我看到了。我希望他能夠考慮這個問題。我看到他在SO上有些活躍。無論如何,我將其標記爲答案,因爲它最能描述我的選擇。 –