Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多次捕获异常-C#_C#_Exception_Exception Handling - Fatal编程技术网

多次捕获异常-C#

多次捕获异常-C#,c#,exception,exception-handling,C#,Exception,Exception Handling,具体i处理器处理器。过程方法实现: private void ProcessData(IProcessor processor) { Data data = new Data(); try { processor.Process(data); } catch( Exception e ) { CustomCode(e); } } 我想对出现在ProcessData()方法或其“try”块中的所有异

具体i处理器
处理器。过程
方法实现:

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

    try
    {
        processor.Process(data);
    }
    catch( Exception e )
    {
        CustomCode(e);
    }
}
我想对出现在
ProcessData()
方法或其“try”块中的所有异常运行
CustomCode()
方法 (调用堆栈中从
ProcessData()
到抛出异常的堆栈末尾的所有代码都应由多个异常处理程序处理-在本例中,应同时运行
DoSomething()
CustomCode()
)。 我怎样才能做到这一点?我知道我可以在“
DoSomething();
”之后加上“throw;”,但这意味着处理器的每个实现中的每个程序员都应该始终记住写“throw;” 在catch(…)中,以便可以运行
CustomCode(e)
。能做得更好吗

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

}

我同意@Seabizkit的评论,您可能不想在
过程中实现try-catch,或者至少
抛出
进程
的catch块末尾出现异常以隐藏它是一种不好的做法

否则,解决方案可能是在
ProcessData()
中设置一个
finally
块,检查数据是否已处理(例如,设置了一个特殊标志),如果未处理,则意味着出现了问题,必须执行
CustomCode()。比如:

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

如果希望customerCode始终发生,而不考虑异常,则存在设计缺陷。为什么不从process()中删除try catch并让processdata()处理它呢。如果异常是由它自己处理的,那么您需要选择哪个应该处理什么。您不应该捕获
NullReferenceException
(NPE是java,或者您有自己的异常类),而应该避免它。因此,根本不需要关心这个异常。在其中一个示例中,我将事务提交到数据库。如果提交此事务后出现异常,我希望回滚此事务。每个IPProcessor实现都应该有另一个异常处理代码,这取决于进程(数据)正在执行的操作。您可以使用委托。如果我理解正确,您希望在异常发生时调用CustomCode和DoSomething。我希望在ProcessData方法级别上实现异常处理,因为我有许多处理器类的实现。我将修改有问题的代码,以免混淆您。我同意使用finally块的解决方案是正确的:)
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();
    }
}