一个基本流程是这样的:
我在UI(用户界面层)层的一个WinForm 中通过获取服务的方式:
IMyDs mMyDs = ServiceActivator.GetService<IMyDs>();
调用DS(数据服务层)的一个方法:
public void SaveInfo(ref StudentInfo info,ref List<StudentInfoDetail> detailList,string strType)
{
 try
  {
     ...
     info = mInfo;
     detailList = mDetailList;
     throw new MyException("数据已存在");
     ...
  ]
  catch(Exception ex)
  {
     throw  ex;
  }
]在UI层捕获定义的异常:
try
{
   ...
   mMyDs.SaveInfo(curInfo,curList,"Add");
   ...
]
catch(MyException mex)
{
   textBox1.text = curInfo.Name;
}
catch(Exception ex)
{
}结果UI层返回回来的curInfo并不是在DS层赋的新值.
然后我将DS层的throw  ex;这一行注释掉.
再测试就可以返回DS层赋的新值.


不知道其中的原由.

解决方案 »

  1.   

    没有什么特别的异常.单步跟踪过.
    跟踪到DS层里面,DS层赋值也成功.
    在throw  ex; 设断点.
    查看参数info的值.也是新赋予的值.
    只是传回去就不是新值了.往大伙顶一顶.
      

  2.   

    throw new MyException("数据已存在"); 
    你将这行的改下,
    throw new (Exception)MyException("数据已存在");因该是异常处理,不是按照LZ的想法运行的。 
      

  3.   

    throw new MyException("数据已存在"); 
    这个应该放在catch中!
      

  4.   

    try 

      ... 
      mMyDs.SaveInfo(curInfo,curList,"Add"); 
      ... 
    }
    这个不是应该 mMyDs.SaveInfo(ref curInfo,ref curList,"Add")么?
      

  5.   

    这个不是应该 mMyDs.SaveInfo(ref curInfo,ref curList,"Add")么?
    这个错误应该在编译阶段就会发现吧!
      

  6.   

    你在Catch里面抛出了新异常,对于本地的异常你catch了却放给了外面,状态参量可能发生了回滚操作,因此值是不正确的。因为你将本地异常抛给外部处理这种做法本身就是不被建议的,或者说严重些是违法的。C#希望的是本地异常本地处理。请遵循这种原则。
      

  7.   

    LZ调用的是服务,所以方法内抛出异常则回滚了(有隐性事务)
    你可以试一下先提交,再抛异常,不确定,没有调试过
    public void SaveInfo(ref StudentInfo info,ref List <StudentInfoDetail> detailList,string strType) 

    try 
      { 
         using(TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Required)) 
         {
             info = mInfo; 
             detailList = mDetailList;
             //在这里提交事务 
             scope.Complete();         throw new MyException("数据已存在");      } 
        ... 
      } 
      catch(Exception ex) 
      { 
        throw  ex; 
      } 
      

  8.   

    楼上说的没错. 如果是异常退出,那就返回INT型的数据,指示错误类型吧!