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