多次捕获异常 - C#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多次捕获异常 - C#相关的知识,希望对你有一定的参考价值。

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)可以运行。能以某种方式做得更好吗?

答案

我同意@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();
    }
}
另一答案
public void Process(Data data)
{
  try
  {
    Thing a = null;
    a.MakeSomething();
  }
  catch( NullPointerException e )
  {   
    CustomCode();
    DoSomething();
  }
  catch(Exception ex)
  {
   CustomCode();
 }

}

以上是关于多次捕获异常 - C#的主要内容,如果未能解决你的问题,请参考以下文章

异常和TCP通讯

代码中异常捕获输出

捕获多个异常-C# [重复]

C/C++代码内捕获异常发生时的调用栈

在混合 C/Fortran 代码中捕获浮点异常

实验九:异常的抛出捕获并处理