多次捕获异常 - C#

问题描述 投票:1回答:2
private void ProcessData(IProcessor processor)
{    
    Data data = new Data();

    try
    {
        processor.Process(data);
    }
    catch( Exception e )
    {
        CustomCode(e);
    }
}

具体的IProcessor processor.Process方法实现:

public void Process(Data data)
{
    try
    {
        Thing a = null;
        a.MakeSomething();
    }
    catch( NullPointerException e )
    {
        DoSomething();
    }
}

我想为CustomCode()方法或其“try”块中出现的所有异常运行ProcessData()方法(从ProcessData()调用堆栈中的所有代码直到堆栈结束,抛出异常应由多个异常处理程序处理 - 在本例中均为应该运行DoSomething()CustomCode())。我怎样才能做到这一点?我知道我可以加“扔;”在“DoSomething();”之后但这意味着处理器的每个实现中的每个程序员都应该记住写“throw;”在catch(...)中,以便CustomCode(e)可以运行。能以某种方式做得更好吗?

c# exception exception-handling
2个回答
1
投票

我同意@Seabizkit评论,你可能不希望在Process实现中尝试捕获或者至少throw;Process的catch块结束时异常隐藏它是一种不好的做法。

否则,解决方案可能是在finally中有一个ProcessData()块,你在那里检查数据是否被处理(例如,设置了一个特殊标志),如果没有,这意味着出现问题并且必须执行CustomCode(),但是你不要不知道是什么样的例外。就像是:

private void ProcessData()
{    
    Data data = new Data();

    try
    {
        Processor processor = new Processor();
        processor.Process(data);
    }
    catch( Exception e )
    {
        CustomCode(e);
    }

    finally {
        if (!data.IsProcessed) CustomCode();
    }
}

1
投票
public void Process(Data data)
{
  try
  {
    Thing a = null;
    a.MakeSomething();
  }
  catch( NullPointerException e )
  {   
    CustomCode();
    DoSomething();
  }
  catch(Exception ex)
  {
   CustomCode();
 }

}

© www.soinside.com 2019 - 2024. All rights reserved.