何时处理异常?

sco*_*ttm 3 c# exception-handling

我正在编写一个应用程序,我可以通过多个步骤提供任务.我有一些类似于下面的代码,我想知道这是否是处理异常的常规方法.这个代码可能永远不会被其他任何人看到,但它可能是,所以我想知道我正在按照任何人的预期处理异常.

IEnumerable<Task> Tasks;

foreach(var task in Tasks)
{
 try
 {
   //boiler plate prep for task (loading libraries, connecting, logging start, etc)

   foreach(var step in task.Steps)
   {  
      try
      {
        step.Execute();
      }
      catch(Exception ex)
      {
        LogStepError(step, ex);
        throw;
      }
    }

    //Notify parties task has been completed successfully, log task completion
  }
  catch(Exception ex)
  {
      LogTaskFailure(task);
  }
  finally
  {
    //close connections, etc
  }
}



interface ITaskStep
{
    void Execute()
    {

    }            
}
Run Code Online (Sandbox Code Playgroud)

我还想补充一点,任务步骤正在实现ITaskStep接口,因此Execute的实现不是我自己的(在这个例子中,有人可以实现接口).我的代码只是加载库并运行任何ITasks及其ITaskSteps.

Rob*_*edy 7

继续捕获异常以记录它们的存在.但是如果你还没有真正解决导致抛出异常的问题,那么请重新抛出它以便调用者处理.不要吞下它.

上面的代码捕获a TaskIsBogusException和a PrinterOnFireException并以相同的方式处理它们:记录它并继续执行下一个任务.这样做是假的任务很好,因为你完成了任务,但是如果你抓住了一个PrinterOnFireException并且不重新抛出它,那么通过高兴,打印机最好还是不要着火.

如果您不打算重新抛出,那么只捕获代码知道如何处理的特定异常类型.让其他一切(你不知道如何处理的东西,或者你从未想过的东西)传播到下一个可用的异常处理程序.