【问题标题】:Retrieve FormatException Argument检索 FormatException 参数
【发布时间】:2011-05-23 01:03:39
【问题描述】:

我正在使用这样的闭源第三方库:

object val = SomeClass.ExtractValue( someObject );

现在,在更远的地方,第三方库尝试解析具有意外格式的 DateTime 值并引发 FormatException。

在这种情况下,我想检索它没有成功解析的字符串并尝试自己解析它。 像这样的:

object val;
try
{
    val = SomeClass.ExtractValue( someObject );
}
catch( FormatException e )
{
    string failed = e.GetParseArgument( );
    val = DateTime.Parse( failed + " 2010" );
}

是的,简单地附加年份是毫无意义的,但你明白了。 第三方库不支持我需要的所有格式,但我也不能轻易从“someObject”中获取数据。 (是的,我可以尝试使用 Reflector 复制库所做的事情,但我想避免这种情况。)

有没有办法做到这一点? 谢谢。

【问题讨论】:

  • 您是否可以控制第 3 方库的输入? IE,你能否解析 SomeObject 中的 dateTime,并在传入之前以你知道第三方可以接受的格式重新保存它?
  • 不。实际上,someObject 是一个 IDataReader 对象。

标签: c# exception arguments stack-frame


【解决方案1】:

由于someObject 是一个IDataReader,您可以创建一个装饰器并将其传递给ExtractValue。然后,您可以拦截日期字符串并在将其传递给库之前修改格式,例如

public class DateFormattingDataReader : IDataReader
{
    private readonly IDataReader inner;

    public DateFormattingDataReader(IDataReader inner)
    {
        this.inner = inner;
    }

    public string GetString(int index)
    {
        string s = this.inner.GetString(index);
        if(index == problematicColumnIndex)
        {
            //try to parse string and then format it for the library
        }
        else return s;
    }
}

或者,您可以记录从阅读器读取的所有值,然后您可以将失败的数据作为最后读取的项目并尝试自己解析。

【讨论】:

  • 谢谢,解决方案并不像我希望的那么简单,但我会试一试。
  • @Andreas - 由于 IDataReader 是一个相当大的接口,因此使用像 linfu 这样的动态代理并拦截所需的方法可能更容易,而不是创建自己的自定义装饰器类。
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2010-11-14
相关资源
最近更新 更多