多次捕获异常 - C#

时间:2017-12-22 08:55:31

标签: c# exception exception-handling

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()方法或其"尝试"中出现的所有异常运行ProcessData()方法。块 (从ProcessData()调用堆栈中的所有代码直到引发异常的堆栈结束应由多个异常处理程序处理 - 在此示例中应运行DoSomething()CustomCode()。 我怎样才能做到这一点?我知道我可以添加" throw;"在" DoSomething();"之后但这意味着处理器的每个实现中的每个程序员都应该记住写" throw;" 在catch(...)中,以便CustomCode(e)可以运行。它可以以某种方式做得更好吗?

2 个答案:

答案 0 :(得分:1)

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

}

答案 1 :(得分:1)

我同意@Seabizkit评论,您可能不希望Process实现中的try-catch或throw;的catch块结尾的异常Process隐藏这是一种不好的做法。

否则,解决方案可能是在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();
    }
}