Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Automapper处理定制的异常,因此可以';我不能在别处处理它们_C#_Asp.net_Automapper - Fatal编程技术网

C# Automapper处理定制的异常,因此可以';我不能在别处处理它们

C# Automapper处理定制的异常,因此可以';我不能在别处处理它们,c#,asp.net,automapper,C#,Asp.net,Automapper,我在我的解析程序中抛出自定义异常,但它们被Automapper捕获和包装,因此我们无法在程序的其他地方处理它们。我已经包含了一个简单的问题示例,期望的结果是捕获InterfaceError,但它只捕获一个AutoMapperException,InterfaceError作为内部异常 课堂上: public Order MapOrder(InterfaceOrder iOrder) { try { Order mappedOrder = Mapper.Map<

我在我的解析程序中抛出自定义异常,但它们被Automapper捕获和包装,因此我们无法在程序的其他地方处理它们。我已经包含了一个简单的问题示例,期望的结果是捕获InterfaceError,但它只捕获一个AutoMapperException,InterfaceError作为内部异常

课堂上:

public Order MapOrder(InterfaceOrder iOrder)
{
    try
    {
        Order mappedOrder = Mapper.Map<InterfaceOrder, Order>(iOrder);
    }
    catch (InterfaceException ex)
    {
        Log("Interface error");
    }
    catch (Exception ex) 
    {
        Log("error");  
    }

    return mappedOrder;
}
公共秩序地图秩序(InterfaceOrder iOrder)
{
尝试
{
Order mappedOrder=Mapper.Map(iOrder);
}
捕获(接口异常)
{
日志(“接口错误”);
}
捕获(例外情况除外)
{
日志(“错误”);
}
退货订单;
}
映射:

Mapper.CreateMap<InterfaceOrder, Order>()                
      .ForMember(c => c.Name, op => op.ResolveUsing(data =>
        {
            if (Name.Length > 50) 
            { 
                throw new InterfaceException("Error!", ex);                                                                   
            }
            else 
            {
                return c.Name
            }
        }));
Mapper.CreateMap()
.ForMember(c=>c.Name,op=>op.ResolveUsing(数据=>
{
如果(Name.Length>50)
{ 
抛出新的InterfaceeException(“Error!”,ex);
}
其他的
{
返回c.名称
}
}));

Automapper不允许异常直接从映射过程中转义,而是尝试将其封装在自己的异常中,正如您所注意到的那样。最好将对Map的调用封装在一个函数中,该函数捕获
AutoMapperMappingException
并将其展开

public ToClass Map<FromClass, ToClass>(FromClass fc)
{
    try
    {
        return Mapper.Map<FromClass, ToClass>(fc);
    }
    catch(AutoMapperMappingException autoMapperException)
    {
        throw autoMapperException.InnerException; 
        // this will break your call stack
        // you may not know where the error is called and rather
        // want to clone the InnerException or throw a brand new Exception
    }
}
公共到类映射(来自类fc)
{
尝试
{
返回Mapper.Map(fc);
}
捕获(自动映射异常自动映射异常)
{
抛出autoMapperException.InnerException;
//这将破坏您的调用堆栈
//您可能不知道在哪里调用错误,而是
//要克隆InnerException或引发全新的异常吗
}
}
一个有趣的注释。
只有从
ForMember(…MapFrom(…)
call抛出异常时,才会对异常进行包装。如果在
AfterMap(…)
中抛出相同的异常,则不会将其包装。

重复问题我看到了你的问题,但我觉得我的问题不同,因为我捕获异常时没有遇到问题,我的问题是捕获的异常是一个自动映射异常,InterfaceeException作为内部异常。我只想抓住接口异常。谢谢,这对我不管用。InnerException仍然是“AutoMappingException”,而不是我的自定义exceptionOk,修复了它。它应该是
autoMapperException.InnerException.InnerException