如何在出错后继续循环?

时间:2014-02-03 16:18:14

标签: c# .net-4.5

我有一个运行一个大循环的应用程序,它可以一次性读取数据,写入PDF并通过电子邮件发送文件。有时,会出现错误,我必须回溯到导致错误的原因。基本上整个循环都在Try / Catch块中。有两个循环,基本上(伪代码):

try
  // Loop 1
  process 1
    // Loop 2
    process 2
catch
  // Message box error

有没有办法可以继续循环并跳过错误?也许保存一个例外的日志,以便我以后可以保存?

3 个答案:

答案 0 :(得分:5)

在循环中使用另一个try ... catch

try
  foreach () // Loop one
    try
      foreach () // Loop two
    catch 
      // Log error, or ignore, then it continues loop 1    
catch
  // Message box error

您可以根据需要嵌套尽可能多的try ... catch构造;但是,这会很快增加程序的复杂性,因此请谨慎使用;并且在可能的情况下,将代码块隔离到函数/方法,每个代码块都是自己的,需要的恢复过程。

答案 1 :(得分:4)

不要将try..catch用作for之外的万能药。 将其从那里移除并将其放在那些你知道可能会造成麻烦的单一指令周围。

越紧越好。 然后,您将能够处理该情况,而不会超出整个循环或过程:

for(...)
{
    // procedural code

    try {
        // least possible problem code

    } catch(Exception ex) {
        // log/report error 1
        // use continue/break to continue with next cycle or break out of the loop
        Log.Message("Exception (in big loop #01): " + ex.Message);
    }

    // procedural code

    try {
        // least possible problem code

    } catch(Exception ex) {
        // log/report error 2
        // use continue/break to continue with next cycle or break out of the loop
        Log.Message("Exception (in big loop #02):" + ex.Message);
    }

    // procedural code
}

通过这种方式,您还可以区分发生异常的位置。

要记录异常,您必须以这种方式实现Log类:

using System.IO;

public class Log
{
    public static void Message(string message)
    {
        using (StreamWriter writer = File.AppendText("path_to_dir\\log.txt"))
        {
            writer.WriteLine(message);
        }
    }
}

这个Log类非常基础,可以通过以下方式进行改进:

  • 不要使用静态方法
  • 不使用singleton,将logger对象注入big-loop-function
  • 在每行前面添加时间和日期
  • 添加标准设施和严重程度(最好从syslogd获取)
  • 如果严重程度超过阈值级别,也允许发送电子邮件
  • 允许根据时间,行或文件大小进行日志滚动
  • 如果在记录异常时发生异常会怎样?一个异常!?
  • 更多

我在这里放的只是为了让您了解记录错误。这是一个相当广泛的专业领域。

答案 2 :(得分:2)

也许是这样的?

// Loop 1
  try
    process 1
    // Loop 2
      process 2
  catch
    // Message box error

这取决于你想要什么。你想忽略哪些错误,那些错误源于PROCESS ONE,PROCESS TWO或者两者兼而有之?上面的伪代码将忽略所有错误并继续外部循环1。