AutoMapper:为什么没有捕获到这个异常

时间:2010-09-14 15:44:14

标签: automapper

我已经更新了我的问题,因为我意识到我的代码是原始问题的原因。然而,在进一步调查问题时,我现在遇到了在映射过程中在我的代码中发生的异常,但是我无法在映射表达式扩展中捕获。

基本上,当“dictionaryKey”包含字典中未找到的值时,下面的代码将抛出一个keynotfoundexception。就Automapper而言,字典保存在要映射的源对象中,而且请求的dictionaryKeys来自目标对象上的属性(要映射到):

public dynamic GetValue(string dictionaryKey)
{
   return _dictionary[dictionaryKey].Value;
}

下面完整地显示了automapper扩展类,我在行中添加了注释,导致调用上面的代码,抛出异常。问题是它没有被周围的代码捕获,而是一直抛到Mapper.Map< ...>(...)调用。导致这个问题的原因是,为什么try catch块中没有捕获到异常(我在try / catch块中的代码中添加了断点来确认异常是在GetValue(...)中引发的。

public static IMappingExpression<ActiveRecord, TDestination> ConvertFromDictionary<TDestination>(this IMappingExpression<ActiveRecord, TDestination> exp, Func<string, string> propertyNameMapper)
{
   foreach (
      PropertyInfo pi in typeof (TDestination).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
   {
      if (!pi.CanWrite)
         continue;

      string propertyName = pi.Name;
      propertyName = propertyNameMapper(propertyName);

      try
      {
         // The following code will fail when the target read/write property does not exist in the 
         // source dictionary.  This is thrown in GetValue as a KeyNotFoundException.  But it is not
         // caught in this try/catch.  It makes it's way all the way up to the calling code
         // i.e. var entity = Mapper.Map<ActiveRecord, EntityDetail>(activeRecord);
         exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r.ActiveFields.GetValue(propertyName)));
      }
      catch (Exception ex)
      {
         // This is never reached by the exception above
         throw ex;
      }
   }
   return exp;
}

更新 虽然在GetValue调用中抛出了“key not found exception”,但它被包含在AutoMapper.AutoMappingException中,该异常在下面的行中冒泡:

客户客户= Mapper.Map(记录);

当然,为这些对象调用Mapper.Map会触发我的IMappingExpression实现来执行映射,因为它设置为:

Mapper.CreateMap()。ConvertFromDictionary(propName =&gt; propName);

由于Automapper是一个围绕automapper内部工作的静态包装类,这是因为IMappingExpression的实现中没有捕获到异常的原因,而是冒出了触发地图调用本身的代码?

2 个答案:

答案 0 :(得分:0)

老兄,这可能是一个愚蠢的问题,但为什么在你允许数据访问你的字典之前不进行containsKey?

答案 1 :(得分:0)

这是一个黑暗中的镜头,但实际上抛出的“异常”是否有可能不是来自异常?请注意问题“Why is UnhandledExceptionEventArgs.ExceptionObject an object and not an Exception?”的答案:

  

这不能输入Exception,因为可以在.Net中抛出不是从System.Exception派生的对象。这在C#或VB.Net中是不可能的,但在其他基于CLR的语言中也是可能的。因此,API必须支持这种可能性并使用类型对象。

     

因此,虽然它不应该为null,但它实际上可能不是System.Exception。

     

有关详细信息,请参阅CLI规范部分10.5(特别是CLS规则40)